前言:
本篇文章纯粹是个人学习日记。如有错误或不正确的地方,请指出,谢谢!
我在学习郭霖的《第一行代码》,就想找找有没有比较简便的方法替代第十章的最佳实践网络下载去下载网络文件。然后就想用EventBus代替其中的 AsyncTask 和 Interface回调接口。
1.EventBus可以非常方便的发送和订阅事件。
2.EventBus自带线程池,利用自身的线程调度机制,随意转换子线程和主线程。
效果图:
上图是下载中的一些操作和回显
上图是完成时的一些回显
自己画了一张大概的"大局流程图",方便大家更容易的理解。
有专家研究过,图像记忆是最好的记忆方法!
导入:
我用的是Android Studio3.0 在app的build.gradle里添加
implementation 'org.greenrobot:eventbus:3.1.1' //EventBus导包
implementation 'com.squareup.okhttp3:okhttp:3.10.0' //OkHttp导包
implementation 'com.daimajia.numberprogressbar:library:1.4@aar'//好看的ProgressBar
EventBus部分代码:
1.自定义MessageEvent实体类
public class MessageEvent {
private int tag; //标志位,方便EventBus辨识
private String url; //下载地址,我也利用这个传入一些操作信息,所以名字不标准
private int progress; //反馈过程的进度
public MessageEvent(int tag,String url,int progress) {
super();
this.tag = tag;
this.url = url;
this.progress = progress;
}
public int getProgress() {
return progress;
}
public int getTag() {
return tag;
}
public String getUrl() {
return url;
}
}
2.子线程的下载流程(敲黑板)
放在Service类里面的
static final int START_DOWNLOAD = 1; //标志位:开始下载
static final int FAILED__DOWNLOAD = 2; //标志位:下载失败
static final int SUCCESS_DOWNLOAD = 3; //标志位:下载完成
static final int CANCEL_DOWNLOAD = 4; //标志位:取消下载
static final int PAUSE_DOWNLOAD = 5; //标志位:暂停下载
static final int UPDATE_PROGRESS = 6; //标志位:更新进度
private boolean isStarted = false; //操作子线程的标志状态:是否运行
private boolean isCanceled = false; //操作子线程的标志状态:是否取消
private boolean isPaused = false; //操作子线程的标志状态:是否暂停
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onSubThread(MessageEvent event) {
switch (event.getTag()) {
case START_DOWNLOAD:
//最开始的启动前台服务消息
startForeground(1,getNotification("正在获取资源...",-1));
InputStream is = null;
RandomAccessFile saveFile = null;
File file = null;
try {
//已经下载的长度
long downloadLength = 0;