標籤:not home ack 開發 ann title oid zed 四大組件
接上篇《android開發藝術探索》讀書筆記(十)--Android的訊息機制
No1:
在Android中可以扮演線程角色的有很多,比如AsyncTask、IntentService、HandlerThread。
AsyncTask底層封裝了線程池和Handler,主要是為了方便開發人員在子線程中更新UI。
HandlerThread底層直接使用線程,是一種具有訊息迴圈的線程,在它內部可以使用Handler。
IntentService底層使用了線程,是一個服務,系統對其進行了封裝使其可以更方便地執行背景工作,IntentService內部採用了HandlerThread來執行任務,當任務執行完畢後IntentService會自動結束。
No2:
系統通過時間片輪轉的方式調度每個線程。
No3:
主線程的作用是運行四大組件以及處理它們和使用者的互動,子線程的作用是執行耗時任務。
No4:
AsyncTask是一個輕量級的非同步任務類,並不適合進行特別耗時的背景工作,對於特別耗時的任務來說,建議使用線程池
No5:
AsyncTask核心方法:
1)onPreExecute():主線程執行,準備工作
2)doInBackground(Params...params):線程池中執行,此方法中可以調用publishProgress方法來更新任務進度
3)onProgressUpdate(Progress...values):主線程執行,當背景工作執行進度發生改變時調用
4)onPostExecute(Result result):主線程執行,傳回值
5)onCancelled():非同步任務被取消時調用
No6:
AsyncTask限制條件:
1)AsyncTask的類必須在主線程中載入
2)AsyncTask的對象必須在主線程中建立
3)execute方法必須在UI線程調用
4)不要在程式中直接調用onPreExecute()、onPostExecute、doInBackground和onProgressUpdate方法
5)一個AsyncTask對象只能執行一次,即只能調用一次execute方法,否則會報運行時異常
6)Android1.6之前,AsyncTask串列執行,1.6採用線程池處理並行任務,3.0為了避免並發錯誤,又採用串列。但我們可以通過AsyncTask的executeOnExecutor並行地執行任務
No7:
AsyncTask工作原理
AsyncTask.execute-->
AsyncTask.executeOnExecutor-->
AsyncTask.onPreExecute-->
AsyncTask.doInBackground-->
AsyncTask.postResult-->
No8:
AsyncTask中有兩個線程池SerialExecutor和THREAD_POOL_EXECUTOR和一個Handler(InternalHandler)
線程池SerialExecutor用於任務的排隊,而線程池THREAD_POOL_EXECUTOR用於真正地執行任務,InternalHandler用於將執行環境從線程池切換到主線程。
No9:
Android3.0及以上版本,可以採用AsyncTask的executeOnExecutor方法,這是Android3.0新添加的方法,不能在低版本上使用。
No10:
HandlerThread繼承了Thread,它是一種可以使用Handler的Thread,實現方法:
public void run(){ mTid = Process.myTid(); Looper.prepare(); synchronized(this){ mLooper = Looper.myLooper(); notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); Looper.loop(); mTid = -1;}
No11:
普通Thread主要用於在run方法中執行一個耗時任務,而HandlerThread在內部建立了訊息佇列,外界需要通過Handler的訊息方式來通知HandlerThread執行一個具體的任務。
No12:
IntentService是一種特殊的Service,它繼承了Service並且它是一個抽象類別,因此必須建立它的子類才能使用IntentService。
No13:
線程池的好處
1)重用線程池中的線程,避免因為線程的建立和銷毀所帶來的效能開銷
2)能有效控制線程池的最大並發數,避免大量的線程之間因互相搶佔系統資源而導致的阻塞現象
3)能夠對線程進行簡單的管理,並提供定時執行以及指定間隔迴圈執行等功能
No14:
Executor是一個介面,真正的線程池的實現為ThreadPoolExecutor。
No15:
線程池ThreadPoolExecutor
《android開發藝術探索》讀書筆記(十一)--Android的線程和線程池