Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> Android多線程下載

Android多線程下載

編輯:Android開發教程

項目源碼下載

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.cn/OS/extra/

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved