Android使用okhttp封装多文件批量下载 (带进度条,取消下载)

在网上搜索了很多关于okhttp封装的网络框架,唯独没找到完美实现了多个文件批量下载的案例,当前使用的最多的也就是okhttp了,所以,我学习了各位大神的封装后,自己也试着封装了一个关于okhttp的网络请求框架,方便项目中的使用。


实现的功能基本如下:

  1. post,get请求网络数据
  2. 多文件的上传(进度监听)
  3. 多文件下载(批量下载,依次下载,进度监听)

封装的项目结构:
Android使用okhttp封装多文件批量下载 (带进度条,取消下载)_第1张图片


本次封装侧重点在于多文件的依次下载,每一个下载的文件形成一个队列,自定义进度条显示文件下载已完成的个数和下载总任务量,每一个文件的下载都有一个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我就不多介绍了,网上资源也很多,如果大家还有什么好的方式实现多文件批量一次下载的,可以跟我交流,大家一起学习学习。

代码传送门

你可能感兴趣的:(android)