须要继承 AsyncTask,重写 doInBackground 方法。
onPreExecute 运行在调度线程
doInBackground 运行在线程池中
onPostExecute / onProgressUpdate / onCancelled 运行在 UI 线程中。面试
AsyncTask 内部有两个静态线程池
一个线程池 SERIAL_EXECUTOR 表示串行线程池,内部包含一个消息队列,用来保存任务、按顺序调度任务
一个 THREAD_POOL_EXECUTOR 用来执行任务,其线程数量是根据 CPU 核数计算的
一个跑在主线程的 Handler,把执行进度和执行结果的回调发送到主线程
这两个线程池和一个 Handler 都是静态的,其实是全部的 AsyncTask 对象公用的bash
Android源码分析—带你认识不同的AsyncTask - 任玉刚
别再傻傻得认为AsyncTask只能够在主线程中建立实例和调用execute方法 - smileiam的专栏并发
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler(){
public void handlerMessage(Message msg){
...
}
};
Looper.loop();
}
复制代码
@Override
public void run() {
mTid = Process.myTid();
// 为当前线程建立 Looper
Looper.prepare();
synchronized (this) {
// 若是建立完成以前调用了 getLooper 方法,会被阻塞
mLooper = Looper.myLooper();
// mLooper 已经完成初始化,若是有线程调用 getLooper 方法且被阻塞,唤醒它
notifyAll();
}
Process.setThreadPriority(mPriority);
// 若是重写了 onLooperPrepared,会得到回调
onLooperPrepared();
// 进入循环
Looper.loop();
mTid = -1;
}
复制代码
HandlerThread 在 run 方法中建立 Looper 并开始循环,若是 Looper 建立完成以前调用 getLooper 会被阻塞,直到初始化完成。
另外 HandlerThread 提供了 quit 和 quitSafely 两个方法,用于中止其 Looper。异步
继承 IntentService,实现其 onHandleIntent 方法。ide
IntentService 在 onCreate 方法中启动了 HandlerThread 并建立了异步 Handler,而后将 onStartCommend 方法转换到异步线程中执行,并回调给 onHandleIntent 方法。
IntentService 因为在异步线程执行,因此是串行的,而且执行完全部任务后会自动中止 Service。oop
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
复制代码
参数说明:源码分析
当有新的任务进入线程池中时:post
Executors 提供了几种经常使用的线程池:ui