本文是《Android開發(fā)藝術(shù)探索》的學(xué)習(xí)筆記
Android中的線程形態(tài)
1.AsyncTask
AsyncTask封裝了Thread和Handler,是抽象的泛型類,提供了Params,Progress,Result這三個泛型參數(shù)
四個核心方法:
- 1.onPreExecute() 主線程中執(zhí)行,異步任務(wù)之前調(diào)用
- 2.doInBackground(Params... par) 異步后臺執(zhí)行
- 3.onProgressUpdate(Progress... value) 主線程中執(zhí)行,進度發(fā)生變化該方法被調(diào)用
- 4.onPostExecute(Result res) 主線程中執(zhí)行,異步任務(wù)執(zhí)行完改方法被調(diào)用
使用過程中有以下條件限制
- 1.AsyncTask的類必須在主線程中加載鲸郊。在5.0的源碼中ActivityThread的main方法中調(diào)用AsyncTask的init方法
- 2.AsyncTask的對象必須在主線程中創(chuàng)建
- 3.execute方法必須在UI線程調(diào)用
- 4.不要在程序中直接調(diào)用上述四個核心方法
- 5.一個AsyncTask對象只能執(zhí)行一次,即只能調(diào)用一次execute方法,否則報運行時異常
- 6.版本差異
- 1.在Android1.6之前是串行執(zhí)行任務(wù)屁魏;
- 2.Android1.6的時候采取并行處理;
- 3.Android3.0又采取串行執(zhí)行捉腥,盡管如此3.0以后的版本還可以通過AsyncTask的executeOnExecutor來并行執(zhí)行任務(wù)
2.HandlerThread
HandlerThread繼承了Thread. 該線程運行的時候創(chuàng)建Looper氓拼。可以說是自帶Looper的Thread
3.IntentService
IntentService抽象類抵碟,繼承了Service. 內(nèi)部包含了ServiceHandler和HandlerThread.
IntentService流程1
![IntentService流程2](https://raw.githubusercontent.com/sheltonliu/sheltonliu.github.io/hexo/blog/MarkdownPhotos/2017/07/06/IntentService%E6%B5%81%E7%A8%8B2.jpg)
IntentService流程2
public class LocalIntentService extends IntentService {
private static final String TAG = "LocalIntentService";
public LocalIntentService() {
super(TAG);
}
@Override
protected void onHandleIntent(final Intent intent) {
final String action = intent.getStringExtra("task_action");
Log.d(TAG, "receive task :" + action);
SystemClock.sleep(3000);
if ("com.ryg.action.TASK1".equals(action)) {
Log.d(TAG, "handle task: " + action);
}
}
@Override
public void onDestroy() {
Log.d(TAG, "service destroyed.");
super.onDestroy();
}
}
啟動服務(wù)
Intent service = new Intent(this, LocalIntentService.class);
service.putExtra("task_action", "com.ryg.action.TASK1");
startService(service);
service.putExtra("task_action", "com.ryg.action.TASK2");
startService(service);
service.putExtra("task_action", "com.ryg.action.TASK3");
startService(service);
Android中的線程池
線程池的優(yōu)點:
- 1.重用線程桃漾,避免開銷
- 2.有效控制線程并發(fā)數(shù),避免因搶占資源造成的阻塞
- 3.有效管理拟逮,提供定時及循環(huán)間隔執(zhí)行等功能
ThreadPoolExecutor
參數(shù):
- 1.corePoolSize: 核心線程數(shù)撬统。默認情況下核心線程在線程池中會一直存活,即便是閑置狀態(tài)敦迄。如果將ThreadPoolExecutor的allowCoreThreadTimeOut設(shè)置為true,那么閑置的核心線程在等待新任務(wù)到來時會有超時策略
- 2.maximumPoolSize:容納的最大線程數(shù)
- 3.keepAliveTime:非核心線程閑置時的超時時長恋追,超過這個時長,非核心線程就會被回收罚屋。
- 4.TimeUnit
- 5.workQueue
- 6.ThreadFactory
線程池的分類
- 1.FixedThreadPool: newFixedThreadPool方法創(chuàng)建几于。是一種數(shù)量固定的線程池,只有核心線程沿后,且核心線程不會被回收沿彭,可以快速相應(yīng)外界請求。沒有超時機制尖滚,沒有隊列大小限制喉刘。
- 2.CachedThreadPool:newCachedThreadPool方法創(chuàng)建。是一種線程數(shù)量不定的線程池漆弄,只有非核心線程睦裳。有超時機制。適合執(zhí)行大量的耗時較少的任務(wù)
- 3.ScheduledThreadPool:核心線程數(shù)量是固定的撼唾,非核心線程數(shù)是沒有固定的廉邑,當(dāng)非核心線程閑置時會被立即回收。主要用于執(zhí)行定時任務(wù)和具有固定周期的重復(fù)任務(wù)。
- 4.SingleThreadExecutor:線程池內(nèi)部只有一個核心線程蛛蒙,確保所有的任務(wù)都在同一個線程中按順序執(zhí)行糙箍。
private void runThreadPool() {
Runnable command = new Runnable() {
@Override
public void run() {
SystemClock.sleep(2000);
}
};
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);
fixedThreadPool.execute(command);
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
cachedThreadPool.execute(command);
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(4);
// 2000ms后執(zhí)行command
scheduledThreadPool.schedule(command, 2000, TimeUnit.MILLISECONDS);
// 延遲10ms后,每隔1000ms執(zhí)行一次command
scheduledThreadPool.scheduleAtFixedRate(command, 10, 1000, TimeUnit.MILLISECONDS);
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
singleThreadExecutor.execute(command);
}
參考:
《Android開發(fā)藝術(shù)探索》