上篇文章我们讲解传统hander使用的一些分析,本篇文章将会针对如何使用RxTask以及其优势进行说明。
我们都知道,rxAndroid(rxjava)在线程调度方面做得非常优秀,使用起来也非常方便,那么为什么我们还要自己封装一个handler+thread的库呢?
首先,看过rxAndroid源码的朋友都知道,它的线程调度,本质上也是通过handler实现的,只是进行了高度的封装。
其次,rxAndroid如果仅仅作为一个线程调度库来用的话,显得很重,如果没记错的话rxAndorid库及相关依赖应该是300k左右,这个大小可以说是不小了。有人也许会问,为什么仅仅使用线程调度功能,用响应式编程不就行了,通常情况来说确实是这样没错,但是有些人,比如我,往往只用到了它的线程调度功能,响应式编程虽然大家都在提倡,但是依然还未达到主流的地步,在这种情况下,贸然使用风格迥异的编程对于一个成熟的项目来说是一个下下策,就好比kotlin,flutter,我暂时不用他们不是因为他们不强大,而是在当下来说,他们仍未达到主流。
而贸然使用非,主流技术进行产品开发,对于公司来说是不负责的,因为你很难保证公司招的下一个人会你这个技术。
最后,通常来讲,一个优秀的库,应该是小而精,而不是大而全,就像rxAndroid一样,如果他的线程调度部分可以单独依赖,那么可能也就没有什么RxTask了。当然了,这里也不是说rxAndroid不优秀,只是如果它能够拆分的更细致一点话,相信对于广大开发者来说,能够更好的进行技术组合。
而RxTask的特点,概括一下就是:
- 基于原生handler(易于修改)
- 轻量级(不到一千行代码)
- 功能专一(仅仅只含有线程调度和线程管理功能)
- 支持绑定fragment或activity的生命周期,有效防止内存泄漏
- 绑定生命周期后,在生命周期结束时支持完成子线程中的任务或者中断任务,可以根据自身需求改变
- 方便快速的创建一个子线程任务,减少频繁创建回收线程的性能损耗
当然了,我觉得最大优点还是易于修改,毕竟不到一千行代码,随便看下就可以根据自身需求进行更改,rxAndroid这种大型库来讲,想clone下来自己维护,自己改,太不现实了。
推荐哪些人尝试一下本库:
- 现在为止还在随意创建handler和thread的
- 使用了rxAndroid进行线程调度,但是仅仅只用到了rxAndroid的线程调度
如何使用本库?
**compile 'com.xujl:task:0.0.1-alpha'**
常规用法:
1.线程调度,当前为子线程,需要快速切回主线程中操作控件
RxExecutor.getInstance()
.executeUiTask(new Task() {
@Override
public void onlyRunUiTask () {
super.onlyRunUiTask();
//ui相关操作
}
});
只需要调用RxExecutor的executeUiTask方法,并且覆写Task的onlyRunUiTask方法即可实现快速切回主线程进行ui操作,温馨提示,本方法只是在内部创建维护了一个handler,没有创建线程,所以没有线程损耗。
2.在子线程中做耗时操作,并且在子线程执行完毕后,在主线程进行ui操作
RxExecutor.getInstance()
.executeTask(new Task() {
@Override
public void run (Emitter emitter) throws Exception {
super.run(emitter);
//模拟耗时操作
Thread.sleep(1000);
}
@Override
public void onFinished () {
super.onFinished();
//ui相关操作
}
});
3.在子线程中做耗时操作,并且在子线程执行完毕后,发送某些数据到主线程并进行ui操作
RxExecutor.getInstance()
.executeTask(new Task() {
@Override
public void run (Emitter emitter) throws Exception {
super.run(emitter);
//模拟耗时操作
Thread.sleep(1000);
emitter.next("任务完成");
}
@Override
public void onNext (Object object) {
super.onNext(object);
String result = (String) object;
//拿到结果result,并进行相关ui操作
}
用过rxAndroid的同学应该对这种写法很熟了,不多做解释。
4.在子线程中做耗时操作,并且这个耗时任务绑定生命周期,并且在子线程执行完毕后,在主线程进行ui操作
此使用方法涉及绑定界面,请参考github上的demo进行使用
注意:如果任务未结束时,生命周期结束,可以选择完成子线程的任务或者不完成(通常情况下,我们都会要求依然完成子线程任务,以防止数据操作执行到一半退出后出现数据错误),但是不论你选择哪种,框架均不会再回调onNext和onFinished方法,因为此时handler已经解除了和界面的依赖
另外,需要特别指出一点,如果你希望虚拟机能够在生命周期结束后尽快回收,或者你的子线程任务是个耗时很长的任务,那么你需要单独创建一个自己的TaskCallable类继承TaskCallable,这点相信看过第一篇文章的同学都知道为什么了,因为activity内部使用匿名内部类方式创建一个task时,依然会造成隐式持有activity,这是任务如果未结束,activity依然是无法回收的。具体实现,参考demo。
以上可以说是大家平时用到的最多的情况了,框架中还封装了平时常见的倒计时任务(如验证码倒计时),和定时循环任务(如网络请求轮询)。如果大家还需要实现其他功能,可以自己动手修改添加,也可以加入沟通群,直接向作者提出。
技术交流群:275885217---Android架构研发协会