首页 > 系统 > Android > 正文

Android用HandlerThread模拟AsyncTask功能(ThreadTask)

2019-12-12 05:55:21
字体:
来源:转载
供稿:网友

前言

 AsyncTask是个好东西,能处理绝大多数应用线程和更新UI的任务,由于其内部使用了静态线程池,如果你有一堆异步任务(例如全局定时更新数据、同一个Activity中多个AsyncTask同时执行)其中有不能马上执行完的情况(例如网络请求超时),那就糟了,其他任务都还等着呢,就会出现任务卡住的情况。此时就需要直接上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都在在主线程执行,又要保证执行的顺序,所以采用Handler来控制执行顺序,根据Loop的不同,Handler能切换在子线程中执行代码还是在主线程中执行代码。

结束:

除了不受线程池控制以外,还能被真正的cancel掉(AsyncTask是不能的,只是一个标记)。

以上就是Android  用HandlerThread模拟AsyncTask功能的代码实现,欢迎大家来交流。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表