Handler+Thread的一种封装尝试RxTask(下篇)

项目地址:github.com/AcgnCodeMon…java

  上篇文章咱们讲解传统hander使用的一些分析,本篇文章将会针对如何使用RxTask以及其优点进行说明。git

  咱们都知道,rxAndroid(rxjava)在线程调度方面作得很是优秀,使用起来也很是方便,那么为何咱们还要本身封装一个handler+thread的库呢?github

  首先,看过rxAndroid源码的朋友都知道,它的线程调度,本质上也是经过handler实现的,只是进行了高度的封装。
编程

  其次,rxAndroid若是仅仅做为一个线程调度库来用的话,显得很重,若是没记错的话rxAndorid库及相关依赖应该是300k左右,这个大小能够说是不小了。有人也许会问,为何仅仅使用线程调度功能,用响应式编程不就好了,一般状况来讲确实是这样没错,可是有些人,好比我,每每只用到了它的线程调度功能,响应式编程虽然你们都在提倡,可是依然还未达到主流的地步,在这种状况下,贸然使用风格迥异的编程对于一个成熟的项目来讲是一个下下策,就比如kotlin,flutter,我暂时不用他们不是由于他们不强大,而是在当下来讲,他们仍未达到主流。
  而贸然使用非,主流技术进行产品开发,对于公司来讲是不负责的,由于你很难保证公司招的下一我的会你这个技术。网络

  最后,一般来说,一个优秀的库,应该是小而精,而不是大而全,就像rxAndroid同样,若是他的线程调度部分能够单独依赖,那么可能也就没有什么RxTask了。固然了,这里也不是说rxAndroid不优秀,只是若是它可以拆分的更细致一点话,相信对于广大开发者来讲,可以更好的进行技术组合。架构

  而RxTask的特色,归纳一下就是:框架

  • 基于原生handler(易于修改)
  • 轻量级(不到一千行代码)
  • 功能专注(仅仅只含有线程调度和线程管理功能)
  • 支持绑定fragment或activity的生命周期,有效防止内存泄漏
  • 绑定生命周期后,在生命周期结束时支持完成子线程中的任务或者中断任务,能够根据自身需求改变
  • 方便快速的建立一个子线程任务,减小频繁建立回收线程的性能损耗

  固然了,我以为最大优势仍是易于修改,毕竟不到一千行代码,随便看下就能够根据自身需求进行更改,rxAndroid这种大型库来说,想clone下来本身维护,本身改,太不现实了。ide

  推荐哪些人尝试一下本库:性能

  • 如今为止还在随意建立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,没有建立线程,因此没有线程损耗。ui

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架构研发协会

相关文章
相关标签/搜索