最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android用HandlerThread模擬AsyncTask功能(ThreadTask)

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

前言

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

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

相關(guān)文章

最新評論

全椒县| 岚皋县| 水城县| 江达县| 泉州市| 会泽县| 金堂县| 托克托县| 黄龙县| 来凤县| 伊宁县| 时尚| 泌阳县| 应城市| 江孜县| 盐边县| 济源市| 睢宁县| 河北省| 沁源县| 古田县| 城口县| 萨迦县| 济阳县| 南木林县| 长阳| 长海县| 通榆县| 当雄县| 台北县| 泾川县| 永新县| 莆田市| 抚松县| 邢台县| 德江县| 桂阳县| 霍山县| 定边县| 原平市| 吉安县|