《android開發藝術探索》讀書筆記(十一)--Android的線程和線程池

來源:互聯網
上載者:User

標籤: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的線程和線程池

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.