Android多線程下載

來源:互聯網
上載者:User

項目源碼下載

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/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.