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