1. 程式人生 > >Android使用okhttp封裝多檔案批量下載 (帶進度條,取消下載)

Android使用okhttp封裝多檔案批量下載 (帶進度條,取消下載)

在網上搜索了很多關於okhttp封裝的網路框架,唯獨沒找到完美實現了多個檔案批量下載的案例,當前使用的最多的也就是okhttp了,所以,我學習了各位大神的封裝後,自己也試著封裝了一個關於okhttp的網路請求框架,方便專案中的使用。

實現的功能基本如下:

  1. post,get請求網路資料
  2. 多檔案的上傳(進度監聽)
  3. 多檔案下載(批量下載,依次下載,進度監聽)

封裝的專案結構:
可以作為架包

本次封裝側重點在於多檔案的依次下載,每一個下載的檔案形成一個佇列,自定義進度條顯示檔案下載已完成的個數和下載總任務量,每一個檔案的下載都有一個tag,方便取消任務的識別。

(1).get請求資料

 OkClient.request(ParamManager.getNewsListParam(2, 3), null, new IResponseCallback() {
            @Override
            public void onSuccess(int tag, Object object) {
                Log.e("wujie", object.toString());
            }

            @Override
            public void onError(int tag, OkError error) {

            }
        });

(2).post請求資料

 OkClient.request(ParamManager.getPost(1, 8), null, new IResponseCallback() {
            @Override
            public void onSuccess(int tag, Object object) {
                Log.e("wujie", object.toString());
            }

            @Override
            public void onError(int
tag, OkError error) { } });

(3).檔案上傳

 File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
       OkClient.upload(ParamManager.upload(1, file), null, new IResponseCallback() {
           @Override
           public void onSuccess(int tag, Object object) {
               Log.e("wujie", object.toString());
           }

           @Override
           public void onError(int tag, OkError error) {

           }
       });

(4).檔案下載

OkClient.download(ParamManager.download(), null, new IResponseCallback() {
            @Override
            public void onSuccess(int tag, Object object) {
                Log.e("wujie", "SUCCESS");
            }

            @Override
            public void onError(int tag, OkError error) {
                Log.e("wujie", "onError");

            }
        }, new ProgressListener() {
            @Override
            public void onProgress(long bytesWritten, long contentLength, long percent) {
                Log.e("wujie", percent + "%");
            }
        });

以上是檔案post,get請求資料,檔案上傳,檔案下載的呼叫方式,其實多檔案批量下載的實現方式只是在下載檔案的過程中更改邏輯即可,下面我就來介紹下多檔案批量依次下載的思路。
首先,選中多個下載檔案,將檔案的下載地址存放在陣列中,然後開始使用上述方法下載陣列中的第一個檔案,同時定義一個全域性變數nowfile用於掌控下載檔案的個數,當第一個檔案下載完成時,該變數增加1,進度條歸零,以此類推,當下載全部完成後,下載進度對話方塊消失。雖然看起來很簡單,但是在實現的過程中還是存在很多細節需要注意的。也不是一個簡單的事情。


    /**
     * 下載檔案
     *
     * @param downloadurls
     */

    public void downloadfile(String downloadurls[]) {

        OkClient.download(htmltype,ParamManager.download(downloadurls[nowfile]), null, new IResponseCallback() {
            @Override
            public void onSuccess(int tag, Object object) {
                Log.e("wujie", "SUCCESS");
                handler.sendEmptyMessage(DOWN_SUCCESS);
            }

            @Override
            public void onError(int tag, OkError error) {
                Log.i("wujie", "downFailed:異常: " + error);
                handler.sendEmptyMessage(DOWN_FAILED);
            }
        }, new ProgressListener() {
            @Override
            public void onProgress(long bytesWritten, long contentLength, long percent) {
                Log.e("wujie", percent + "%");
                Message msg = new Message();
                msg.what = DOWN_PROGRESS;
                msg.arg1 = (int) percent;
                handler.sendMessage(msg);

            }
        });

    }

Hander處理方式:

private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case DOWN_START:
                    downDialog.updateView(0, "準備下載");
                    break;
                case DOWN_PROGRESS:
                    int progress = msg.arg1;
                    downDialog.updateView(progress, (nowfile + 1) + "/" + totlefile);
                    break;
                case DOWN_SUCCESS:
                    nowfile = nowfile + 1;
                    if (htmltype == 4) {
                        downloadthumb();
                    }
                    if (nowfile == totlefile) {
                        Log.i("wujie", "下載全部完成" + nowfile);
                        downDialog.dissmiss();
                        downthumb = null;
                        downVideoUrls = null;
                        nowfile=0;
                        totlefile=0;
                    } else {
                        downDialog.updateView(100, "");
                        downDialog.updateView(0, "準備下載");
                        if (htmltype == 4) {
                            downloadfile(downVideoUrls);
                        }else if(htmltype==3){
                            downloadfile(downthumb);
                        }

                    }

                    break;
                case 3:
                    downDialog.updateView(0, "下載異常");
                    break;
            }

        }
    };
  /**
     * 取消請求
     *
     * @param tag
     */
    public static void cancelRequest(int... tag) {
        NetManager.getInstance().cancelRequest(tag);
    }

實現方式大致就是這些,至於怎麼封裝的okhttp我就不多介紹了,網上資源也很多,如果大家還有什麼好的方式實現多檔案批量一次下載的,可以跟我交流,大家一起學習學習。

程式碼傳送門