您的位置:首页 > 移动开发 > Android开发

Android 异步任务队列实现

2016-07-29 22:01 836 查看
前段时间看过一篇文章,里面初略提到异步任务链式调用。

异步任务有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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  handler android task thread