新聞中心
怎么在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