好久没有发过文章了,发生了好多事,一言难尽,言归正传,自我检讨感觉自己越来越懒,本来想说工作忙,但是感觉是在给自己找借口,只是希望自己不要断更,不求一周一篇,一月一篇就可以了。原创文章,如需转载请私聊作者
这一系列文章都是android框架设计,然后git地址:
点击此进入github,包含所有源码设计图
多任务处理器
多任务处理库为的是解决批量任务处理应运而生,最初是因为写图片压缩库,当时图片处理作为一个单独的库,里面其实抽象了多任务。
PS:暂时只能在android中使用,但是如果把handler去掉的话可以供java后台使用
接入以及使用
1. 引入
|
|
2. 使用
2.1 定义taskmodel
首先需要定义taskmodel,定义完成后便可以使用了,下面定义了三个不同的任务
|
|
2.2 开始使用
定义完成后交给批量任务处理器即可
一、背景
咱们来分析一下多任务,在使用者的角度可以简单理解为其是一个黑盒,使用者放入之后经过黑盒处理之后再取出这样就达到了最终的结果。
二、分析抽象
既然是这样我们可以抽象一下,因为在linux中万物皆文件,所以咱们传入的其实是一个sourcePath,那么下一步我们就考虑我们想要的是什么了,然后咱们可以把那个黑盒理解为规则,那么可以抽象为fun parse(sourcePath:String,targetPath:String?):String,这里估计大家会疑问为什么会有targetPath,不是已经有处理结果了么,这其实是使其更具扩展性,比如要处理一个文件,使用者在处理之前就已经为其定好了targetPath,那么在使用时直接传入即可,但是还有一种比如将图片转为base64那么知道的只是规则结果是未知的,这时候就需要去取这个返回值了。
经过以上的分析这个库的主干就出来了,那么下一步就是要为其装饰了。
使用者在使用时肯定想的是这个库能够处理批量任务并且能够有相应的回调通知,这样使用者只需要自己定义好处理规则封装为对象,传入这个多任务处理器引擎中,得到相应的回调。
三、多任务处理器结构图

四、伪代码真调用
这里以kotlin为例,当然也支持java,只是kotlin使用起来会更简洁,来模拟一下咱们想要调用
|
|
以上只是简单写了几个回调,基本调用方式是这样,可能使用者还想要自定义一下线程池,并行,串行等
五、编码
因为要写的是一个框架类的库,需要对扩展开放对修改关闭,此时再根据上面的抽象以及图便可以很清晰明了的将其完成,下面来细看
5.1 任务Model封装
因为是批量任务处理,并且还需要兼容不同类型,那么这个Model必须要实现ProcessModel接口,设计之初为了灵活设计了三个接口,但是又发现用起来比较麻烦,后来又将其粒度变大,有舍有得吧。下面来看一下接口的实现:
PS:注释中有详细的说明不再做细说明
|
|
5.2 引擎处理设置
这里使用的是java的线程池的主要接口ExecutorService,主要是其中为我们封装好了我们需要的一些通用的方法,我这里还是把任务交给线程去处理,如果是单线程则是串行,多的话就是并行处理了,还可以实现接口进行自定义
|
|
5.3 核心任务处理
这里就包含了任务处理器以及任务回调了,因为使用者想要的就是把任务处理完成以及结果的回调不论成功或者失败。
|
|
5.4 以上任务处理的必须部分都完成,剩下的就是将任务model交付ProcessTask处理即可
因为库的主要作用是为了方便大家使用,这里进行默认实现,因为代码量略大不在这里贴了,如果感觉默认的使用不能满足大家的使用,大家可以自己在实现相关接口之后进行自己的impl,这里贴一下库的使用代码,所有回调的结果都有,需要哪个回调实现哪个回调方法即可。
5.4.1 以下为java方式调用
主要是kotlin使用比较简洁,但是兼容了java的调用:
|
|
5.4.2 以下为kotlin方式调用
kotlin调用的话就稍微简单一点
|
|