須要繼承 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