AsyncTask使你可以在你的介面上執行非同步工作。它在一個背景工作執行緒中執行耗時操作然後把結果傳給介面線程,不需要你親自去管理線程和控制代碼。
要使用它,你必須從AsyncTask派生一個類並實現回調方法doInBackground(),此方法在一個背景線程池中運行。要更新你的介面,你應實現onPostExecute(),它把doInBackground()的結果弄過來並在介面線程中運行,於是你可以安全地更新你的介面。你可以在介面線程中調用execute()來執行AsyncTask任務。
例如,你可以把上一章中的例子用AsyncTask實現:
public void onClick(View v) {<br /> new DownloadImageTask().execute("http://example.com/image.png");<br />}<br /><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); }}</pre><p>
現在介面變得安全並且代碼變得簡單了。因為把工作分成了在背景工作執行緒中完成的部分和在介面線程中完成的部分。
你應該閱讀AsyncTask的參考來完全理解如何使用這個類。這裡是一個對它如何工作的概覽:
你可以使用範型指定參數的類型,進度值,和任務的最終值。
方法doInBackground()自動在背景工作執行緒中執行
onPreExecute(),onPostExecute(),
和onProgressUpdate()都在介面線程中執行
doInBackground()返回的值被傳遞到onPostExecute()
你可以在任何時刻在doInBackground()中調用publishProgress()引起在介面線程中執行onProgressUpdate()
你可以在任意時刻在任何線程中取消任務
警告:另一個你在使用背景工作執行緒時可能遇到的問題是activity的意外重啟(比如螢幕的方向變了),這可能銷毀你的背景工作執行緒。要瞭解如何才能在此類現象發生時避免你的任務被殺以及如何在activity死亡時正確的取消你的任務,請參閱Shelves例子的源碼。