android-priority-jobqueue分析(一)—— 消息的处理

一、开源库介绍

android-priority-jobqueue 是一个支持后台执行队列的开源库,可以很方便执行相应的任务,并且支持任务的计划执行,循环执行,分组执行和持久化保存,总而言之,是一个功能强大的任务执行神器。关于该库的更多介绍,戳以下链接:github地址

二、源码分析

由于这是第一次去看开源库的代码,所以我首先从代码的调用开始入手,JobManager.addJob() 是添加任务的调用入口。所以首先进入了JobManager这个类,类的主要变量如下:
JobManager
其中可以看到有几个主要的类,分别是JobManagerThread,PriorityMessageQueue,MessageFactory。PriorityMessageQueue和MessageFactory从字面上看,应该是有关联的,一个是优先级消息队列,一个是消息工厂。那我们先看到MessageFactory。

(一)MessageFactory

这个类有两个成员变量,pools负责存储消息,counts负责对存储的消息数计数,另外还有两个方法 ,分别是obtain和release,其中obtain接收一个类的类型,然后根据类型从pools取出消息,release则是对消息进行回收。所以,MessageFactory相当于一个消息的存储区,可以从这里取出和存放消息,可以对对象进行复用,减少对象的创建。

(二)PriorityMessageQueue

这是一个优先级消息队列,在这个库中,自定义了若干的消息类型,例如添加任务,取消任务,每种任务类型都有一个优先级,通过在优先级队内部中维护了一个消息队列数组UnsafeMessageQueue[] queues,按照优先级的大小将消息插入对应下标的消息队列中,每次取消息时对queues进行倒序遍历取出,通过这个数据结构确保了不同优先级消息的执行顺序。其中post方法是插入消息,next则是从队列中取出消息。

(三)JobManagerThread

JobManagerThread实现了Runnable接口,可以推断他就是执行任务的线程了。由于JobManagerThread比较复杂,我们可以先梳理一下它主要的执行过程。找到run方法,如下:
Run
messageQueue就是上文分析的优先级消息队列,这里可以看出消息队列执行了comsume方法,用来处理不同的消息类型的。我们进入consume查看究竟,
这里写图片描述
running变量确保一个消费者和一个消息队列的对应关系,接着通过内部的死循环从消息队列取出消息,handle消息,然后MessageFactory再回收消息。

三、总结

android-priority-jobqueue通过消息的形式来对任务进行管理,通过以上的分析,可以梳理出执行的大概流程:启动JobManagerThread线程,添加任务消息,从PriorityMessageQueue循环取出消息,对消息进行处理,处理完成再通过MessageFactory回收消息。由于本次分析的是消息传递机制,具体的任务执行流程下次再进行分析,

猜你喜欢

转载自blog.csdn.net/taoszu/article/details/80725127