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