欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android用HandlerThread模擬AsyncTask功能(ThreadTask)

 更新時(shí)間:2016年07月21日 15:35:05   投稿:lqh  
本文主要講用HandlerThread模擬AsyncTask功能,這里提供實(shí)例代碼以便參考,有需要的小伙伴可以參考下

前言

 AsyncTask是個(gè)好東西,能處理絕大多數(shù)應(yīng)用線程和更新UI的任務(wù),由于其內(nèi)部使用了靜態(tài)線程池,如果你有一堆異步任務(wù)(例如全局定時(shí)更新數(shù)據(jù)、同一個(gè)Activity中多個(gè)AsyncTask同時(shí)執(zhí)行)其中有不能馬上執(zhí)行完的情況(例如網(wǎng)絡(luò)請求超時(shí)),那就糟了,其他任務(wù)都還等著呢,就會出現(xiàn)任務(wù)卡住的情況。此時(shí)就需要直接上Thread了,這里參考AsyncTask的API封裝了一個(gè)ThreadTask,便于必要時(shí)代碼替換,歡迎交流!

 正文實(shí)例代碼:

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) {
        e.printStackTrace();
      }
    }
    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);
        mHandlerThread.quit();
        break;
      case MESSAGE_PROGRESS:
        onProgressUpdate((Progress[]) msg.obj);
        break;
      }
    }
  }
}

代碼說明:

   由于onPreExecute和onPostExecute都在在主線程執(zhí)行,又要保證執(zhí)行的順序,所以采用Handler來控制執(zhí)行順序,根據(jù)Loop的不同,Handler能切換在子線程中執(zhí)行代碼還是在主線程中執(zhí)行代碼。

結(jié)束:

除了不受線程池控制以外,還能被真正的cancel掉(AsyncTask是不能的,只是一個(gè)標(biāo)記)。

以上就是Android  用HandlerThread模擬AsyncTask功能的代碼實(shí)現(xiàn),歡迎大家來交流。

相關(guān)文章

最新評論