(一)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中隐藏加载框。