天天看点

【Android】用HandlerThread模拟AsyncTask功能(ThreadTask)

import android.os.Handler;

import android.os.HandlerThread;

import android.os.Looper;

import android.os.Message;

public abstract class ThreadTask<Params, Progress, Result> {

    private HandlerThread mHandlerThread;

    private TaskHandler mHandler;

    private TaskHandler mUiHandler;

    private Params[] mParams;

    public ThreadTask() {

        mHandlerThread = new HandlerThread("ThreadTask", android.os.Process.THREAD_PRIORITY_BACKGROUND);

        mHandlerThread.start();

        mHandler = new TaskHandler(mHandlerThread.getLooper());

        mUiHandler = new TaskHandler(Looper.getMainLooper());

    }

    protected abstract Result doInBackground(Params... params);

    protected void onPreExecute() {

    protected void onProgressUpdate(Progress... values) {

    protected final void publishProgress(Progress... values) {

        mUiHandler.obtainMessage(MESSAGE_PROGRESS, values).sendToTarget();

    protected void onPostExecute(Result result) {

    public final boolean isCancelled() {

        return mHandlerThread.isInterrupted();

    public final void cancel(boolean mayInterruptIfRunning) {

        if (!mHandlerThread.isInterrupted()) {

            try {

                mHandlerThread.quit();

                mHandlerThread.interrupt();

            } catch (SecurityException e) {

                e.printStackTrace();

            } catch (Exception e) {

            }

        }

        onCancelled();

    protected void onCancelled() {

    public void execute(Params... params) {

        mParams = params;

        onPreExecute();

        mHandler.sendEmptyMessage(MESSAGE_INBACKGROUND);

    private static final int MESSAGE_INBACKGROUND = 0;

    private static final int MESSAGE_POSTEXECUTE = 1;

    private static final int MESSAGE_PROGRESS = 2;

    private class TaskHandler extends Handler {

        public TaskHandler(Looper looper) {

            super(looper);

        @SuppressWarnings("unchecked")

        @Override

        public void handleMessage(Message msg) {

            switch (msg.what) {

            case MESSAGE_INBACKGROUND:

                mUiHandler.obtainMessage(MESSAGE_POSTEXECUTE, doInBackground(mParams)).sendToTarget();

                break;

            case MESSAGE_POSTEXECUTE:

                onPostExecute((Result) msg.obj);

            case MESSAGE_PROGRESS:

                onProgressUpdate((Progress[]) msg.obj);

}

代码说明:

由于onPreExecute和onPostExecute都在在主线程执行,又要保证执行的顺序,所以采用Handler来控制执行顺序,根据Loop的不同,Handler能切换在子线程中执行代码还是在主线程中执行代码。  

文章

后期维护

2014-08-05  正常流程走完以后忘了调用HandlerThread的quit,代码已经更新。

继续阅读