android之多線程工作(一)AsyncTask

來源:互聯網
上載者:User

本文章主要講解下AsyncTask的使用。

       首先,我們得明確下一個概念,什麼是UI線程。顧名思義,ui線程就是管理著使用者介面的那個線程!

       android的ui線程操作並不是安全的,並且和使用者直接進行介面互動的操作都必須在ui線程中進行才可以。這種模式叫做單線程模式。我們在單線程模式下編程一定要注意:不要阻塞ui線程、確保只在ui線程中訪問ui組件。

       當我們要執行一個複雜耗時的演算法並且最終要將計算結果反映到ui上時,我們會發現,我們根本沒辦法同時保證上面的兩點要求;我們肯定會想到開啟一個新的線程,讓這個複雜耗時的任務到後台去執行,但是執行完畢了呢?我們發現,我們無法再與ui進行互動了。

      為瞭解決這種情況,android為我們提供了很多辦法。

1)、handler和message機制:通過顯示的拋出、捕獲資訊與ui進行互動;

2)、Activity.runOnUiThread(Runnable):如果當前線程為ui線程,則立即執行;否則,將參數中的線程操作放入到ui線程的事件隊列中,等待執行。

3)、View.post(Runnable):將操作放入到message隊列中,如果放入成功,該操作將會在ui線程中執行,並返回true,否則返回false

4)、View.postDelayed(Runnable,long)跟第三條基本一樣,只不過添加了一個延遲時間。

5)、android1.5以後為我們提供了一個工具類來搞定這個問題AsyncTask.

 

AsyncTask是抽象類別.AsyncTask定義了三種泛型型別 Params,Progress和Result。 
  

       Params 啟動任務執行的輸入參數,比如HTTP請求的URL

。 
  Progress 背景工作執行的百分比。 

 

 

       Result 後台執行任務最終返回的結果,比如String

 

  。 

 

用程式調用,開發人員需要做的就是實現這些方法。


   

 

1) 子類化AsyncTask

  2) 實現AsyncTask中定義的下面一個或幾個方法

     onPreExecute(), 該方法將在執行實際的後台操作前被UI thread調用。可以在該方法中做一些準備工作,如在介面上顯示一個進度條。

    doInBackground(Params...), 將在onPreExecute 方法執行後馬上執行,該方法運行在後台線程中。這裡將主要負責執行那些很耗時的後台計算工作。可以調用 publishProgress方法來更新即時的任務進度。該方法是抽象方法,子類必須實現。

    onProgressUpdate(Progress...),在publishProgress方法被調用後,UI thread將調用這個方法從而在介面上展示任務的進展情況,例如通過一個進度條進行展示。

    onPostExecute(Result), 在doInBackground 執行完成後,onPostExecute 方法將被UI thread調用,背景計算結果將通過該方法傳遞到UI thread.

 

為了正確的使用AsyncTask類,以下是幾條必須遵守的準則:

  1) Task的執行個體必須在UI thread中建立

  2) execute方法必須在UI thread中調用

  3) 不要手動的調用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)這幾個方法

  4) 該task只能被執行一次,否則多次調用時將會出現異常

 

 

 

package cn.com.chenzheng_java;</p><p>import android.os.AsyncTask;<br />/**<br /> *<br /> * @author chenzheng_java<br /> * @description 非同步任務AcyncTask樣本<br /> *<br /> */<br />public class MyAsyncTask extends AsyncTask<String, Integer, Object> {</p><p>/**<br /> * 該方法由ui線程進行調用,使用者可以在這裡盡情的訪問ui組件。<br /> * 很多時候,我們會在這裡顯示一個進度條啥的,以示後台正在<br /> * 執行某項功能。<br /> */<br />@Override<br />protected void onPreExecute() {<br />super.onPreExecute();<br />}</p><p>/**<br /> * 該方法由後台進程進行調用,進行主要的耗時的那些計算。<br /> * 該方法在onPreExecute方法之後進行調用。當然在執行過程中<br /> * 我們可以每隔多少秒就調用一次publishProgress方法,更新<br /> * 進度資訊<br /> */<br />@Override<br />protected Object doInBackground(String... params) {<br />return null;<br />}</p><p>/**<br /> * doInBackground中調用了publishProgress之後,ui線程就會<br /> * 調用該方法。你可以在這裡動態改變進度條的進度,讓使用者知道<br /> * 當前的進度。<br /> */<br />@Override<br />protected void onProgressUpdate(Integer... values) {<br />super.onProgressUpdate(values);<br />}</p><p>/**<br /> * 當doInBackground執行完畢之後,由ui線程調用。可以在這裡<br /> * 返回我們計算的最終結果給使用者。<br /> */<br />@Override<br />protected void onPostExecute(Object result) {<br />super.onPostExecute(result);<br />}</p><p>}<br />

 

 

------------------------------------------------------------------------------------------

AsyncTask的執行分為四個步驟,每一步都對應一個回調方法,這些方法不應該由應

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.