欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android用HandlerThread模拟AsyncTask功能(ThreadTask)

程序员文章站 2024-03-04 21:14:30
前言  asynctask是个好东西,能处理绝大多数应用线程和更新ui的任务,由于其内部使用了静态线程池,如果你有一堆异步任务(例如全局定时更新数据、同一个ac...

前言

 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功能的代码实现,欢迎大家来交流。