項目源碼下載
https://github.com/Wang-Jun-Chao/AndroidProjects
多線程下載
原理:伺服器CPU分配給每條線程的時間片相同,伺服器頻寬平均分配給每條線程,所以用戶端開啟的線程越多,就能搶佔到更多的伺服器資源
確定每條線程下載多少資料
發送http請求至下載地址
String path = URL url = new URL(path) HttpURLConnection conn = (HttpURLConnection) url() conn() conn() conn()
擷取檔案總長度,然後建立長度一致的臨時檔案
(conn.getResponseCode() ==){ length = conn.getContentLength(); RandomAccessFile raf = RandomAccessFile(getFileName(path), ); raf.setLength(length); raf.();
確定線程下載多少資料
blockSize = / THREAD_COUNT;
計算每條線程下載資料的開始位置和結束位置
( = ; <= ; ++){ startIndex = ( - ) * blockSize; endIndex = * blockSize - ; ( == THREAD_COUNT){ endIndex = length; } new DownLoadThread(startIndex, endIndex, )(); }
再次發送請求至下載地址,請求開始位置至結束位置的資料
String path = ; URL url = URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout); conn.setConnectTimeout); conn.setRequestMethod(); conn.setRequestProperty(, + startIndex + + endIndex); conn.connect();* 下載請求到的資料,存放至臨時檔案中 (conn.getResponseCode() ==){ InputStream is = conn.getInputStream(); RandomAccessFile raf = RandomAccessFile(getFileName(path), ); raf.seek(startIndex); [] b = ]; ; while(( = is.read(b)) !=){ raf.write(b,, ); } raf.(); }
帶斷點續傳的多線程下載
定義一個int變數記錄每條線程下載的資料總長度,然後加上該線程的下載開始位置,得到的結果就是下次下載時,該線程的開始位置,把得到的結果存入快取檔案
total =; while(( = is.read(b)) !=){ raf.write(b,, ); total += ; RandomAccessFile raf2 = RandomAccessFile(threadId + , ); raf2.write((startIndex + total + ).getBytes()); raf2.(); }
下次下載開始時,先讀取快取檔案中的值,得到的值就是該線程新的開始位置
FileInputStream fis = FileInputStream(); BufferedReader br = BufferedReader( InputStreamReader(fis)); text = br.readLine(); int newStartIndex = .parseInt(text); //把讀到的值作為新的開始位置 startIndex = newStartIndex; fis.close();
三條線程都下載完畢之後,刪除快取檔案
RUNNING_THREAD--; (RUNNING_THREAD == ){ ( i = ; i <= ; i++){ File f = File(i + ); f.(); } }
手機版的斷點續傳多線程下載器
把剛才的代碼直接粘貼過來就能用,記得在訪問檔案時的路徑要改成Android的目錄,添加訪問網路和外部儲存的路徑
用進度條顯示下載進度
拿到下載檔案總長度時,設定進度條的最大值
pb.setMax();
進度條需要顯示三條線程的整體下載進度,所以三條線程每下載一次,就要把新下載的長度加入進度條
定義一個int全域變數,記錄三條線程的總下載長度
progress;
* 重新整理進度條
while(( = is.read(b)) !=){ raf.write(b,, ); progress += ; pb.setProgress(progress);
每次斷點下載時,從新的開始位置開始下載,進度條也要從新的位置開始顯示,在讀取快取檔案擷取新的下載開始位置時,也要處理進度條進度
FileInputStream fis = FileInputStream(file); BufferedReader br = BufferedReader( InputStreamReader(fis)); String text = br.readLine(); newStartIndex = Integer.parseInt(text); alreadyDownload = newStartIndex - startIndex; progress += alreadyDownload;
添加文字框顯示百分比進度
tv(progress * / pb() + )
HttpUtils的使用
HttpUtils本身就支援多線程斷點續傳,使用起來非常的方便
建立HttpUtils對象
=
下載檔案
http.download(url, target, , , RequestCallBack<File>() { (ResponseInfo<File> arg0) { tv.setText( + arg0.result.getPath()); } (HttpException arg0, String arg1) { tv.setText( + arg1); } ( total, current, isUploading) { .onLoading(total, current, isUploading); pb.setMax(() total); pb.setProgress(() current); tv_progress.setText(current * / total + ); } });
更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/OS/extra/