(二)CommonLibrary之文件下载

255 阅读2分钟

CommonLibrary

(一)CommonLibrary之Retrofit+RxJava网络请求封装

上一篇大概说了下CommonLibrary的Retrofit+RxJava网络请求封装,这篇说一下关于文件下载的处理。 ###同样先看调用方式 使用的QQ下载地址作为测试

NeedWifiOperate.getDefault().networkTypeShouldBeWifi(new DefaultNetworkTypeCallBack(this) {
            @Override
            public void wifi(int netType) {
                downloadFile();
            }
        }.setDialogOperateListener(new DialogOperateAdapter() {
            @Override
            public void positive(Context context, Dialog dialog) {
                downloadFile();
            }
        }));
        
private void downloadFile() {
        File file = new File(CommonApplication.context.getCacheDir(), System.currentTimeMillis() + ".apk");
        
        DownloadFile downloadFile = new DownloadFile("http://gdown.baidu.com/data/wisegame/13095bef5973a891/QQ_786.apk", file, true, new ChangeViewWithProgressListener(tvExample));
        
        NetworkHelper.getDefault().download(mView, downloadFile, new FileCallBack() {
            @Override
            public void downloadSuccess(File file) {
                mView.downloadFileSuccess(file);
            }

            @Override
            public void downloadFail(Throwable e) {
                mView.downloadFileFail(e);
            }
        });
    }

前面一堆杂七杂八的操作暂时不说,只是一些辅助性的功能,主要还是downloadFile()这个方法,使用方式也很简单对吧,其实需要你们做的就两步

一、 构造下载文件 二、 发起下载请求

开始逐步说明

###构造下载文件 我使用了一个对象封装下载需要的信息,这个对象长这样

//其中的get,set方法就不陈列在此了,没什么意义
public class DownloadFile {
    private String url;
    private File file;
    private boolean cancelable;
    private ProgressListener listener;

    public DownloadFile(String url, File file) {
        this(url, file, false, null);
    }

    public DownloadFile(String url, File file, boolean cancelable, ProgressListener listener) {
        this.url = url;
        this.file = file;
        this.cancelable = cancelable;
        this.listener = listener;
    }
}

看参数名字就能大概猜出来了 url -> 文件的下载地址 file -> 下载到本地的路径 cancelable -> 可否取消下载 listener -> 下载进度

前三个都很容易就构建好了,最后一个下载进度就有点讲究了。先看看这个进度的树状关系

进度继承关系

首先封装了一个将进度在主线程回调的listener,如果你要在主线程中自己处理进度,使用这个就OK了,里面其实就一个Handler做线程切换,没啥好说的。下面还有一个ChangeViewWithProgressListener,这个从名字就能看出来,这是一个可以随着进度更新View的的进度监听器,如果你需要一个View随着下载进度改变的话,这个Listener就能完美帮你完成。在构造这个Listener时需要传入一个IViewProgressEvent,所以你需要把随着进度改变的View实现此接口,然后完成对应的逻辑就可以了。第一步就完成了。

###发起下载请求

NetworkHelper.getDefault().download(mView, downloadFile, new FileCallBack() {
            @Override
            public void downloadSuccess(File file) {
                mView.downloadFileSuccess(file);
            }

            @Override
            public void downloadFail(Throwable e) {
                mView.downloadFileFail(e);
            }
        });

这样就发起请求了,然后在回调中处理对应的逻辑就OK了,在此只讲使用方式,更多代码请看github

tips:这里的文件下载网络加载框是我默认设置的菊花转圈圈,多半不会适合你的项目,所以如果你想使用自己的话,可以参考网络请求加载框的方式在IView中新增方法由BaseActivity实现(注意实现用户自主取消请求时需调用ObservableManager.getInstance().stopObserver()取消下载请求,可参考网络请求加载框的方式),然后在RetrofitNetworkService的download方法onStart中显示加载框,在NetworkBaseObserver中隐藏加载框。