开发中,我们常常会需要有apk升级,或者下载某个文件的问题。所以这里就写了个通用的文件下载的功能 ZDown。通过这篇文章你将看到
- 常用框架 API 接口设计
- 多线程下载原理与实现
- 后台下载,界面退出之后,进来继续显示下载UI的原理
效果图
![]() |
allprojects { repositories { ... maven { url 'https://jitpack.io' } } } implementation 'com.github.LillteZheng:AppUpdate:v1.4' 由于使用了 retrofit 和rxjava 等框架,所以,还需要在您的工程中添加以下关联,不然报错
implementation 'io.reactivex.rxjava2:rxjava:2.2.4' implementation 'io.reactivex.rxjava2:rxandroid:2.1.0' implementation 'com.alibaba:fastjson:1.1.70.android' implementation 'com.squareup.retrofit2:retrofit:2.4.0' implementation 'org.ligboy.retrofit2:converter-fastjson-android:2.1.0' implementation 'com.squareup.retrofit2:converter-scalars:2.4.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0' ZDown.checkWith(this) .url(jsonUrlTest) .get() .listener(new CheckListener<TestBean>() { @Override public void onCheck(final TestBean data) { Log.d(TAG, "zsr onCheck: " + data); } @Override public void onFail(String errorMsg) { Log.d(TAG, "zsr onFail: " + errorMsg); } }).check(); 在listener中,可以把要转换的数据写上,如果不想转换成实体 bean,直接 String.class 就是返回原始的字符串了。 checkWith 还支持写入参数,使用 params(..) ,支持 get() 和 post()
在检查完版本,可以使用如下代码下载文件:
ZDown.with(MainActivity.this) .url(fileUrlTest) //线程设置为3 .threadCount(3) //ui刷新时间为 500 毫秒 .reFreshTime(500) //路径保存的路径,默认内部存 .filePath(mPath) //.allowBackDownload(true) 是否允许后台更新 // .fileName("test.apk") fileName默认根绝连接去截取,也可以自己写 .listener(new TaskListener() { @Override public void onSuccess(String filePath, String md5Msg) { ZCommontUitls.installApk(MainActivity.this,filePath); dialog.dismiss(); } @Override public void onDownloading(ZBean bean) { int progress = (int) bean.progress; updateBtn.setVisibility(View.GONE); progressBar.setVisibility(View.VISIBLE); progressBar.setProgress(progress); } @Override public void onFail(String errorMsg) { Log.d(TAG, "zsr onFail: " + errorMsg); dialog.dismiss(); } }).down(); 内部已混淆,但如果使用 CheckListener 传入 bean 类,bean类需要自己混淆,eg:
-keep class com.zhengsr.appupdate.bean.** { *; } ZDown 为程序入口,它提供以下方法:
- pause() 暂停任务
- start() 开始任务
- stopTask() 停止任务 ,如果你的apk更新不是在 activity 使用,建议在app退出的时候,使用该方法,防止内存泄漏
- stopTaskAndDeleteCache() 停止任务,并删除已文件和数据库,当任务失败时,可以使用
- isTaskExists() 任务是否存在
- isRunning() 是否正在下载
- updateListener() 从后台退回来,如果任务正在下载,直接更新接口就可以了,UI就不会乱了
- deleteCacheAndStart() 当任务失败时,可以用这个把缓存文件和数据删了
