Android用HandlerThread模拟AsyncTask功能(ThreadTask)_Android

前言

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
asynctask handler、asynctask与handler、asynctask和handler、asynctask和thread、asynctask thread,以便于您获取更多的相关知识。

时间: 2024-08-29 02:47:03

Android用HandlerThread模拟AsyncTask功能(ThreadTask)_Android的相关文章

Android用HandlerThread模拟AsyncTask功能(ThreadTask)

前言 AsyncTask是个好东西,能处理绝大多数应用线程和更新UI的任务,由于其内部使用了静态线程池,如果你有一堆异步任务(例如全局定时更新数据.同一个Activity中多个AsyncTask同时执行)其中有不能马上执行完的情况(例如网络请求超时),那就糟了,其他任务都还等着呢,就会出现任务卡住的情况.此时就需要直接上Thread了,这里参考AsyncTask的API封装了一个ThreadTask,便于必要时代码替换,欢迎交流! 正文实例代码: import android.os.Handle

Android中用HandlerThread模拟AsyncTask功能(ThreadTask)

前言 AsyncTask是个好东西,能处理绝大多数应用线程和更新UI的任务,由于其内部使用了静态线程池,如果你有一堆异步任务(例如全局定时更新数据.同一个Activity中多个AsyncTask同时执行)其中有不能马上执行完的情况(例如网络请求超时),那就糟了,其他任务都还等着呢,就会出现任务卡住的情况.此时就需要直接上Thread了,这里参考AsyncTask的API封装了一个ThreadTask,便于必要时代码替换,欢迎交流! 农民伯伯: http://over140.cnblogs.com

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

前言 AsyncTask是个好东西,能处理绝大多数应用线程和更新UI的任务,由于其内部使用了静态线程池,如果你有一堆异步任务(例如全局定时更新数据.同一个Activity中多个AsyncTask同时执行)其中有不能马上执行完的情况(例如网络请求超时),那就糟了,其他任务都还等着呢,就会出现任务卡住的情况.此时就需要直接上Thread了,这里参考AsyncTask的API封装了一个ThreadTask,便于必要时代码替换,欢迎交流!   声明 欢迎转载,但请保留文章原始出处:)  博客园:http

Android中异步类AsyncTask用法总结_Android

本文总结分析了Android中异步类AsyncTask用法.分享给大家供大家参考,具体如下: 最近整理笔记的时候,看到有关AsyncTask不是很理解,重新疏导了一下,有在网上找了一些资料,个人不敢独享,一并发在这里与大家共勉 这里有两种解释的方法,各有侧重点: 第一种解释: Async Task 简介: AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦 AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Pa

Android编程实现换肤功能实例_Android

本文实例讲述了Android编程实现换肤功能的方法.分享给大家供大家参考,具体如下: 本系列专题培训适用范围:初级Android程序员,即有J2SE基础和Android初级水平.J2SE基础是指掌握JAVA语法,1.5.1.6新增的语法不完全掌握也没关系.了解基本的面向对象思想.能编写简单的J2SE程序,掌握基本的调试方法,熟悉Swing更好.Android初级是指掌握Activity.Service.BroadcastReceiver.Intent.SQLite.UI组件的使用,能参照例子编写

Android编程实现简单流量管理功能实例_Android

本文实例讲述了Android编程实现简单流量管理功能的方法.分享给大家供大家参考,具体如下: package cn.itcast.mobilesafe.ui; import java.util.List; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import

在Android模拟器上模拟GPS功能总是null的解决方法_Android

我们都知道,在我们开发时需要在模拟器上模拟GPS,可在Location的时候总是null,上网查了一下,发现如下解决: 网上大侠的解决方案: 在模拟器上获取GPS信息时,使用Location loc = LocationManager.getLastKnownLocation("gps");来获取location信息,但是往往在调试中loc是null的,因为首先需要在模拟器中手动添加GPS信息,有两种手动添加方法 1.在eclipse下,windows-->open perspe

在Android模拟器上模拟GPS功能总是null的解决方法

我们都知道,在我们开发时需要在模拟器上模拟GPS,可在Location的时候总是null,上网查了一下,发现如下解决: 网上大侠的解决方案: 在模拟器上获取GPS信息时,使用Location loc = LocationManager.getLastKnownLocation("gps");来获取location信息,但是往往在调试中loc是null的,因为首先需要在模拟器中手动添加GPS信息,有两种手动添加方法 1.在eclipse下,windows-->open perspe

android开启免提切换功能示例_Android

以下代码实现了android的免提开启和关闭功能 需要添加的权限 复制代码 代码如下: <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> 复制代码 代码如下: /** * 免提 *  * @param context */private void toggleSpeaker(Context context){    AudioManager am = (AudioManage