android程式與執行緒詳解三:AsyncTask

yangxi_001發表於2013-11-19

AsyncTask使你可以在你的介面上執行非同步工作。它在一個工作執行緒中執行耗時操作然後把結果傳給介面執行緒,不需要你親自去管理執行緒和控制程式碼。


要使用它,你必須從AsyncTask派生一個類並實現回撥方法doInBackground(),此方法在一個後臺的執行緒池中執行。要更新你的介面,你應實現onPostExecute(),它把doInBackground()的結果弄過來並在介面執行緒中執行,於是你可以安全地更新你的介面。你可以在介面執行緒中呼叫execute()來執行AsyncTask任務。


例如,你可以把上一章中的例子用AsyncTask實現:

[java] view plaincopy
  1. public void onClick(View v) {  
  2.     new DownloadImageTask().execute("http://example.com/image.png");  
  3. }  
[java] view plaincopy
  1. <pre name="code" class="java">private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {  
  2.     /** 系統把給予AsyncTask.execute() 的引數傳給這個方法並且在後臺執行緒中呼叫這個方法完成工作*/  
  3.     protected Bitmap doInBackground(String... urls) {  
  4.         return loadImageFromNetwork(urls[0]);  
  5.     }  
  6.       
  7.     /** 系統把doInBackground()的執行結果傳送過來並且在介面執行緒中呼叫這個方法執行任務  */  
  8.     protected void onPostExecute(Bitmap result) {  
  9.         mImageView.setImageBitmap(result);  
  10.     }  
  11. }</pre>  

現在介面變得安全並且程式碼變得簡單了。因為把工作分成了在工作執行緒中完成的部分和在介面執行緒中完成的部分。

你應該閱讀AsyncTask的參考來完全理解如何使用這個類。這裡是一個對它如何工作的概覽:

  • 你可以使用範型指定引數的型別,進度值,和任務的最終值。

  • 方法doInBackground()自動在工作執行緒中執行

  • onPreExecute(),onPostExecute(),onProgressUpdate()都在介面執行緒中執行

  • doInBackground()返回的值被傳遞到onPostExecute()

  • 你可以在任何時刻在doInBackground()中呼叫publishProgress()引起在介面執行緒中執行onProgressUpdate()

  • 你可以在任意時刻在任何執行緒中取消任務

警告:另一個你在使用工作執行緒時可能遇到的問題是activity的意外重啟(比如螢幕的方向變了),這可能銷燬你的工作執行緒。要了解如何才能在此類現象發生時避免你的任務被殺以及如何在activity死亡時正確的取消你的任務,請參閱Shelves例子的原始碼。


相關文章