android進程與線程詳解三:AsyncTask

AsyncTask使你可以在你的界面上執行異步工作。它在一個工作線程中執行耗時操作然後把結果傳給界面線程,不需要你親自去管理線程和句柄。
 
 
 
要使用它,你必須從AsyncTask派生一個類並實現回調方法doInBackground(),此方法在一個後臺的線程池中運行。要更新你的界面,你應實現onPostExecute(),它把doInBackground()的結果弄過來並在界面線程中運行,於是你可以安全地更新你的界面。你可以在界面線程中調用execute()來執行AsyncTask任務。
 
 
 
例如,你可以把上一章中的例子用AsyncTask實現:
 
 
public void onClick(View v) { 
    new DownloadImageTask().execute("http://example.com/image.png"); 

 
<pre name="code" class="java">private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { 
    /** 系統把給予AsyncTask.execute() 的參數傳給這個方法並且在後臺線程中調用這個方法完成工作*/ 
    protected Bitmap doInBackground(String… urls) { 
        return loadImageFromNetwork(urls[0]); 
    } 
     
    /** 系統把doInBackground()的執行結果傳送過來並且在界面線程中調用這個方法執行任務  */ 
    protected void onPostExecute(Bitmap result) { 
        mImageView.setImageBitmap(result); 
    } 

 
現在界面變得安全並且代碼變得簡單瞭。因為把工作分成瞭在工作線程中完成的部分和在界面線程中完成的部分。
 
你應該閱讀AsyncTask的參考來完全理解如何使用這個類。這裡是一個對它如何工作的概覽:
 
你可以使用范型指定參數的類型,進度值,和任務的最終值。
 
方法doInBackground()自動在工作線程中執行
 
onPreExecute(),onPostExecute(), 和onProgressUpdate()都在界面線程中執行
 
doInBackground()返回的值被傳遞到onPostExecute()
 
你可以在任何時刻在doInBackground()中調用publishProgress()引起在界面線程中執行onProgressUpdate()
 
你可以在任意時刻在任何線程中取消任務
 
警告:另一個你在使用工作線程時可能遇到的問題是activity的意外重啟(比如屏幕的方向變瞭),這可能銷毀你的工作線程。要瞭解如何才能在此類現象發生時避免你的任務被殺以及如何在activity死亡時正確的取消你的任務,請參閱Shelves例子的源碼。

摘自 nkmnkm的專欄

發佈留言