Android 异步任务队列实现
来源:互联网 发布:淘宝上的阿玛尼旗舰店 编辑:程序博客网 时间:2024/04/30 17:51
前段时间看过一篇文章,里面初略提到异步任务链式调用。
异步任务有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<Message> queue; private Handler handler; private boolean isStop;//是否停止 private ExecutorService pool;
构造函数中需要初始化这些对象:
public TaskManager() { handler = new Handler(Looper.getMainLooper()); queue = new LinkedList<Message>(); 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<Message> queue; private Handler handler; private boolean isStop;//是否停止 private ExecutorService pool; private boolean isInvalid = false;//是否无效,标记当前实例只能用一次 public TaskManager() { handler = new Handler(Looper.getMainLooper()); queue = new LinkedList<Message>(); 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; }}
2 0
- Android 异步任务队列实现
- Android下载任务队列实现
- Python异步任务队列
- celery 异步任务队列
- PHP使用swoole来实现实时异步任务队列
- PHP操作swoole来实现实时异步任务队列
- android:AsyncTask实现异步处理任务
- android:AsyncTask实现异步处理任务
- Android自用-----AsyncTask实现异步处理任务
- Android异步任务AsyncTask实现方式
- Android异步任务AsyncTask实现方式
- android异步任务加载数据界面实现
- Android异步任务AsyncTask实现方式
- Android AsyncTask实现异步任务的执行
- Android hander实现异步线程队列化
- 异步任务执行之-队列
- celery配合rabbitmq任务队列实现任务的异步调度执行
- Java Design Demo -简单的队列-异步多任务队列(java android)
- Spark入门(Python版)
- Callable、Future和FutureTask
- Hadoop系列之-安装与Wordcount例子
- 递归获取树状目录结构文件名
- POJ 2978 Colored stones
- Android 异步任务队列实现
- ES5之数组的map方法
- Leetcode Game of Life
- 内核竞态同步机制
- LinearLayout居中
- sql语句那些事——你的脸庞渐渐变得清晰
- 只允许遍历一遍字符串,找出字符串中第一个只出现一次的字符
- 浮点数的尾数基值取2,并采用隐含位表数方法,则这种浮点数的表数效率为()
- Arbitrage--最短路