前言

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

声明

欢迎转载,但请保留文章原始出处:)
博客园:http://www.cnblogs.com
农民伯伯: http://over140.cnblogs.com

正文

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能切换在子线程中执行代码还是在主线程中执行代码。

文章

Android AsyncTask完全解析,带你从源码的角度彻底理解

后期维护

2014-08-05  正常流程走完以后忘了调用HandlerThread的quit,代码已经更新。

结束

除了不受线程池控制以外,还能被真正的cancel掉(AsyncTask是不能的,只是一个标记),写的有些仓促,难免bug,欢迎反馈!

【Android】用HandlerThread模拟AsyncTask功能(ThreadTask)的更多相关文章

  1. Android 开发 HandlerThread详解 转载

    转载请注明出处:http://blog.csdn.net/vnanyesheshou/article/details/75073307 对于Handler不太懂的可以参考我的这两篇文章: Androi ...

  2. Android线程管理之AsyncTask异步任务

    前言: 前面几篇文章主要学习了线程以及线程池的创建与使用,今天来学习一下AsyncTask异步任务,学习下AsyncTask到底解决了什么问题?然而它有什么弊端?正所谓知己知彼百战百胜嘛! 线程管理相 ...

  3. javamail模拟邮箱功能发送电子邮件-基础实战篇(javamail API电子邮件实例)

    引言: JavaMail 是一种可选的.能用于读取.编写和发送电子消息的包 JavaMail jar包下载地址:http://java.sun.com/products/javamail/downlo ...

  4. javamail模拟邮箱功能发送电子邮件-中级实战篇【新增附件发送方法】(javamail API电子邮件实例)

    引言: JavaMail jar包下载地址:http://java.sun.com/products/javamail/downloads/index.html 此篇是紧随上篇文章而封装出来的,阅读本 ...

  5. javamail模拟邮箱功能--邮件删除-中级实战篇【邮件标记方法】(javamail API电子邮件实例)

    前言: JavaMail jar包下载地址:http://java.sun.com/products/javamail/downloads/index.html 本章可能是讲解javamail的最后一 ...

  6. I.MX6 Android 移除 Settings wifi功能

    /********************************************************************* * I.MX6 Android 移除 Settings w ...

  7. Java基础知识强化之网络编程笔记15:Android网络通信之 Android异步任务处理(AsyncTask使用)

         AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的 ...

  8. Java乔晓松-android中调用系统拍照功能并显示拍照的图片

    android中调用系统拍照功能并显示拍照的图片 如果你是拍照完,利用onActivityResult获取data数据,把data数据转换成Bitmap数据,这样获取到的图片,是拍照的照片的缩略图 代 ...

  9. Android 实现登录界面和功能实例

    近期一个android小程序须要登录功能,我简单实现了一下.如今记录下来也当做个笔记,同一时候也希望能够相互学习.所以,假设我的代码有问题,还各位请提出来.多谢了! 以下.就简述一下此实例的主要内容: ...

随机推荐

  1. 动画库Animate.css

    笔记分享: 用法:到官网(http://daneden.github.io/animate.css/),下载animate.min.css文件.点击这里 1.首先引入animate css文件 < ...

  2. Linq查询操作之排序操作

    在Linq中排序操作可以按照一个或多个关键字对序列进行排序.其中第一个排序关键字为主要关键字,第二个排序关键字为次要关键字.Linq排序操作共包含以下5个基本的操作. 1.OrderBy操作,根据排序 ...

  3. 解决64位Windows2003程序字体很小的问题

    先看问题现象: 如图,字小的一B,并且无法通过更改主题字体大小.对话框字体等操作得到解决. 注:该问题可能不限于64位Windows2003,看完解决方法你就明白了,是有个注册表键值缺失或设置不当造成 ...

  4. C#自定义特性实例

    元数据,就是C#中封装的一些类,无法修改.类成员的特性被称为元数据中的注释. 1.什么是特性   (1)属性与特性的区别  属性(Property):属性是面向对象思想里所说的封装在类里面的数据字段, ...

  5. C# ~ 数据库连接

    C#连接数据库(SQL Server)进行数据的读取和写入,学习之. 1. 数据库连接 服务器:“Data Source=服务器IP; Initial Catalog=数据库; User ID=用户名 ...

  6. mysql中变量赋值

    http://www.cnblogs.com/qixuejia/archive/2010/12/21/1913203.html sql server中变量要先申明后赋值: 局部变量用一个@标识,全局变 ...

  7. 代码设置Shape和Selector

    开发中经常需要使用Shape和Selector,如果每个都用xml设置的话,会占用apk大小,同时命名多了也会混乱,使用代码来设置会方便很多. 需要用到2个类:GradientDrawable和Sta ...

  8. ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint......

    今天用Hibernate建立外键的时候发现没有建立 但是创建了这个字段 情景: user表有一字段role,role是role表id字段的外键 原因: user表中已经有记录了,而且有的记录role这 ...

  9. Redis 3.2.1集群搭建

    一.概述 Redis3.0版本之后支持Cluster. 1.1.redis cluster的现状 目前redis支持的cluster特性: 1):节点自动发现 2):slave->master ...

  10. jQuery10种不同动画效果的响应式全屏遮罩层

    遮罩层有很多今天介绍这个jQuery10种不同动画效果的响应式全屏遮罩层 效果预览 下载地址 实例代码 <div class="container"> <head ...