1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      怎么在Android應(yīng)用中實現(xiàn)一個網(wǎng)絡(luò)多線程斷點(diǎn)續(xù)傳下載功能

      怎么在Android應(yīng)用中實現(xiàn)一個網(wǎng)絡(luò)多線程斷點(diǎn)續(xù)傳下載功能?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

      成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供宜城企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計、成都網(wǎng)站設(shè)計成都h5網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為宜城眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。

      原理

      多線程下載的原理就是將要下載的文件分成若干份,其中每份都使用一個單獨(dú)的線程進(jìn)行下載,這樣對于文件的下載速度自然就提高了許多。

      既然要分成若干部分分工下載,自然要知道各個線程自己要下載的起始位置,與要下載的大小。所以我們要解決線程的分配與各個線程定位到下載的位置。

      封裝

      對于多線程下載我們可以將其封裝到一個工具類中DownUtil,向其中傳入下載的鏈接、文件存儲路徑、需要下載的線程數(shù)

      分配線程

      這里通過HttpURLConnection進(jìn)行網(wǎng)絡(luò)請求下載,通過getContentLength()方法獲取下載文件的總大小,再對其平均分配各個線程需要下載的大小。這樣就確定了下載的大小,下面就是定位到各個線程的開始位置進(jìn)行下載,這里可以使用RandomAccessFile來追蹤定位到要下載的位置,它的seek()方法可以進(jìn)行定位。

      線程下載

      下面就是各個線程的下載DownThread,上面已經(jīng)得到了各個線程要下載的初始位置,所以可以通過獲取網(wǎng)絡(luò)請求的輸入流InputStream,通過skip()方法跳躍到指定位置進(jìn)行讀取數(shù)據(jù),再寫入到RandomAccessFile文件中

      一、 編寫基本的UI,三個TextView,分別顯示文件名、下載進(jìn)度和下載速度,一個ProgressBar。二個Button,分別用于開始下載、暫停下載和取消下載。

      
      
      
        
        
      
        
      
        
        
        
      
        
      
          

      在onCreate方法中綁定開始下載按鈕事件:點(diǎn)擊start按鈕,設(shè)置進(jìn)度條可見,并且設(shè)置start的Action,啟動服務(wù)。

      startButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          textView.setText(fileInfo.getFileName());
          progressBar.setVisibility(View.VISIBLE);
          // 通過Intent傳遞參數(shù)給service
          Intent intent = new Intent(MainActivity.this, DownloadService.class);
          intent.setAction(DownloadService.ACTION_START);
          intent.putExtra("fileInfo", fileInfo);
          startService(intent);
        }
      });

      在onCreate方法中綁定暫停下載按鈕事件:點(diǎn)擊stop按鈕,設(shè)置stop的Action,啟動服務(wù)。

      stopButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          // 通過Intent傳遞參數(shù)給service
          Intent intent = new Intent(MainActivity.this, DownloadService.class);
          intent.setAction(DownloadService.ACTION_STOP);
          intent.putExtra("fileInfo", fileInfo);
          startService(intent);
        }
      });

      在onCreate方法中綁定取消下載按鈕事件:點(diǎn)擊cancel按鈕,設(shè)置cancel的Action,啟動服務(wù),之后更新UI。

      cancelButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          // 通過Intent傳遞參數(shù)給service
          Intent intent = new Intent(MainActivity.this, DownloadService.class);
          intent.setAction(DownloadService.ACTION_CANCEL);
          intent.putExtra("fileInfo", fileInfo);
          startService(intent);
      
          // 更新textView和progressBar的顯示UI
          textView.setText("");
          progressBar.setVisibility(View.INVISIBLE);
          progressView.setText("");
          speedView.setText("");
        }
      });

      注冊廣播,用于Service向Activity傳遞一些下載進(jìn)度信息:

      // 靜態(tài)注冊廣播
      IntentFilter intentFilter = new IntentFilter();
      intentFilter.addAction(DownloadService.ACTION_UPDATE);
      registerReceiver(broadcastReceiver, intentFilter);
      
      /**
       * 更新UI
       */
      BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
          if (DownloadService.ACTION_UPDATE.equals(intent.getAction())) {
            int finished = intent.getIntExtra("finished", 0);
            int speed = intent.getIntExtra("speed", 0);
      
            Log.i("Main", finished + "");
            progressBar.setProgress(finished);
            progressView.setText(finished + "%");
            speedView.setText(speed + "KB/s");
          }
        }
      };

      三、 在AndroidManifest.xm文件中聲明權(quán)限,定義服務(wù)

      
      
      
      

      總結(jié)

      多線程的關(guān)鍵就是分配好需要下載的進(jìn)程,定位進(jìn)程下載的準(zhǔn)確位置,獲取輸入流讀取數(shù)據(jù),同時寫入到文件的相應(yīng)位置。可以借助RandomAccessFile來進(jìn)行定位。

      當(dāng)然也并非開的線程數(shù)越多下載的速度也就越快,因為線程越多對于程序處理這些線程也是一種負(fù)擔(dān),過多的話反而會降低下載的速度,所以要合理運(yùn)用。

      看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。


      文章題目:怎么在Android應(yīng)用中實現(xiàn)一個網(wǎng)絡(luò)多線程斷點(diǎn)續(xù)傳下載功能
      文章分享:http://www.ef60e0e.cn/article/gogjpd.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        岳普湖县| 越西县| 外汇| 谢通门县| 大同市| 德钦县| 金阳县| 彭州市| 宁明县| 沁源县| 岳西县| 梧州市| 玛曲县| 静乐县| 瑞金市| 佛冈县| 疏勒县| 巨鹿县| 博乐市| 沭阳县| 收藏| 吴桥县| 两当县| 得荣县| 页游| 会理县| 阆中市| 巴里| 丽水市| 泰和县| 奉贤区| 新乡市| 梁山县| 神木县| 萨嘎县| 久治县| 屏山县| 仁怀市| 西林县| 三门峡市| 依兰县|