Android(安卓)异步任务队列实现
16lz
2022-08-01
前段时间看过一篇文章,里面初略提到异步任务链式调用。
异步任务有AsyncTask,和Handler + Thread等等多种实现,链式调用如RxJava等。
于是一时心急如焚,弄了个简单的,给后来人提供思路:
想在activity中这么写代码:
new TaskManager().next(runnable).next(runnable,CHILD_THREAD).next(runnable,MAIN_THREAD).execute();
这么来看,TaskManager类中需要有next方法,调用后还需返回当前对象:
/** * add runnable, default run in child thread * * @param task * @return */ public TaskManager next(Runnable task) { return next(task, ThreadType.CHILD_THREAD); } public TaskManager next(Runnable task, ThreadType type) { Message message = new Message(); message.task = task; message.type = type; queue.add(message); return this; }
得有消息队列,线程池来创建任务线程,主线程任务就由handler来执行
//异步任务队列 private LinkedList queue; private Handler handler; private boolean isStop;//是否停止 private ExecutorService pool;
构造函数中需要初始化这些对象:
public TaskManager() { handler = new Handler(Looper.getMainLooper()); queue = new LinkedList(); pool = Executors.newSingleThreadExecutor(); }
调用execute执行方法时,循环获取消息队列中的任务,根据其类型决定是用子线程执行还是handler执行:
/** * execute all runnable */ public void execute() { if(isInvalid){ throw new IllegalStateException("This object cannot repeated use,please renew"); } isInvalid = true;//标记用过了 while (!isStop) { Message message = queue.pollFirst(); if (message == null)//返回null,消息队列为null了,结束循环 break; if (message.type == ThreadType.CHILD_THREAD) pool.execute(message.task); else handler.post(message.task); } clear(); }
以上就是大概思路。下面贴出完成代码:
调用处:
new TaskManager().next(new Runnable() { @Override public void run() { Log.v("消息A",Thread.currentThread().getName()); } }).next(new Runnable() { @Override public void run() { Log.v("消息B",Thread.currentThread().getName()); } }).next(new Runnable() { @Override public void run() { Log.v("消息C",Thread.currentThread().getName()); } }, TaskManager.ThreadType.MAIN_THREAD).execute();
TaskManager类完整代码:
/** * @DateTime: 2016-07-13 14:10 * @Author: duke * @Deacription: 异步任务链 */public class TaskManager { //异步任务队列 private LinkedList queue; private Handler handler; private boolean isStop;//是否停止 private ExecutorService pool; private boolean isInvalid = false;//是否无效,标记当前实例只能用一次 public TaskManager() { handler = new Handler(Looper.getMainLooper()); queue = new LinkedList(); pool = Executors.newSingleThreadExecutor(); } /** * add runnable, default run in child thread * * @param task * @return */ public TaskManager next(Runnable task) { return next(task, ThreadType.CHILD_THREAD); } public TaskManager next(Runnable task, ThreadType type) { Message message = new Message(); message.task = task; message.type = type; queue.add(message); return this; } /** * execute all runnable */ public void execute() { if(isInvalid){ throw new IllegalStateException("This object cannot repeated use,please renew"); } isInvalid = true;//标记用过了 while (!isStop) { Message message = queue.pollFirst(); if (message == null)//返回null,消息队列为null了,结束循环 break; if (message.type == ThreadType.CHILD_THREAD) pool.execute(message.task); else handler.post(message.task); } clear(); } /** * stop task */ public void clear() { isStop = true; pool.shutdownNow(); pool = null; handler.removeCallbacksAndMessages(null); handler = null; } public static enum ThreadType { CHILD_THREAD, MAIN_THREAD } public class Message { Runnable task; ThreadType type; }}
更多相关文章
- 浅析Android中的消息机制-解决:Only the original thread that cr
- Android异步消息机制之Handler
- Android(安卓)之 AsyncTask 异步任务
- Android(安卓)任务和回退堆栈---启动任务
- Android开发之消息处理机制(一)——Handler
- Titanium 使用刘明星的Jpush module做android端的消息推送
- Android(安卓)后台任务(五)Service
- android 电容屏(二):驱动调试之基本概念篇
- Windows环境下Android(安卓)Studio系列4—界面介绍