AsyncTask執行時經過四個步驟,執行四個方法:
1.onPreExecute(),運行在UI線程,可以設置或修改UI控件,如顯示一個進度條
2.doInBackground,運行在後台線程,不可以設置或修改UI控件,該方法的執行時機是:
onPreExecute()執行完畢立即調用該方法,在方法中進行耗時操作,可以在該方法中調用publishProgress方法
來發布當執行的進度,調用publishProgress方法後就會立即觸發onProgressUpdate方法
3.onProgressUpdate,運行在UI線程,可以設置或修改UI控件
4.onPostExecute,運行在UI線程,可以設置或修改UI控件,該方法在doInBackground方法執行完畢
後就會調用,該方法的參數就是doInBackground方法返回的結果,可以這樣思考:doInBackground方法
既然有一個返回結果,那麼這個返回結果到底返回給誰呢?答案就是:通過參數形式傳遞給onPostExecute方法
參數說明:
1.doInBackground方法的形參對應的是AsyncTask的第一個參數,即參數類型要相同。doInBackground方法
接收實參的時機是:在UI線程中調用execute方法時為execute方法設置值,調用execute方法,這個值就會通過參數形式傳給doInBackground方法,doInBackground方法返回的結果對應的是AsyncTask的第三個參數,即參數類型要相同,
2.onPostExecute方法的參數值就是doInBackground方法返回的結果傳遞過來的。因此onPostExecute方法的參數
類型與AsyncTask的第三個參數也對應。即相同
3.onProgressUpdate方法的參數類型與AsyncTask的第二個參數對應,即參數類型要相同,在doInBackground方法中可以調用
publishProgress方法將進度值傳遞給onProgressUpdate方法,進度值的類型由AsyncTask的第二個參數類型決定
參數說明小結:
1.AsyncTask的第一個參數類型決定了doInBackground方法、execute方法的參數類型
2.AsyncTask的第二個參數類型決定了publishProgress方法、onProgressUpdate方法的參數類型
3.AsyncTask的第三個參數類型決定了doInBackground方法的返回值類型、onPostExecute方法的參數類型
注:如果不需要參數傳遞,那麼AsyncTask的參數列表可以寫成:AsyncTask
使用AsyncTask類必須遵循的規則:
1.AsyncTask類必須在UI thread加載
2.Task實例必須在UI thread中創建
3.execute方法必須在UI thread中調用
4.不要手動調用onPreExecute、onPostExecute、doInBackground、onProgressUpdate方法
5.該Task只能執行一次,多次調用將會拋出異常
AsyncTask類的使用可以參見AsyncTask源碼注釋部分,其中有詳細說明
(原文鏈接:http://blog.csdn.net/yelangjueqi/article/details/38322647,歡迎轉載,轉載時請注明出處!!)
展示一個例子:
packagecom.text.asynctaskdemo;
importandroid.app.Activity;
importandroid.os.AsyncTask;
importandroid.os.Bundle;
importandroid.util.Log;
publicclassMainActivity
extends
Activity {
privatestaticfinalString
TAG
= "asynctaskdemo";
@Override
protectedvoidonCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new
LoadAllAppsTask().execute(
"Test AsyncTask");
}
privateclassLoadAllAppsTask
extends
AsyncTask {
@Override
protectedvoidonPreExecute()
{
//
TODO
Auto-generated method stub
Log.d(TAG,"onPreExecute");
super.onPreExecute();
}
@Override
protectedLong doInBackground(String... params)
{
//
TODO
Auto-generated method stub
Log.d(TAG,"doInBackground
params[0]="+params[0]);
publishProgress(10);
return100L;
}
@Override
protectedvoidonProgressUpdate(Integer...
values) {
//
TODO
Auto-generated method stub
Log.d(TAG,"onProgressUpdate
values[0]="+ values[0]);
super.onProgressUpdate(values);
}
@Override
protectedvoidonPostExecute(Long
result) {
//
TODO
Auto-generated method stub
Log.d(TAG,"onPostExecute
result="+ result);
super.onPostExecute(result);
}
}
}
輸出結果:
06-10 14:17:08.724: DEBUG/asynctaskdemo(7419): onPreExecute
06-10 14:17:08.731: DEBUG/asynctaskdemo(7419): doInBackground params[0]=Test AsyncTask
06-10 14:17:08.771: DEBUG/asynctaskdemo(7419): onProgressUpdate values[0]=10
06-10 14:17:08.771: DEBUG/asynctaskdemo(7419): onPostExecute result=100
doInBackground(String... params)方法的形參列表可以接受多個參數值,下面演示一下,接受多個參數值的過程:
1.execute方法中傳入多個參數:
newLoadAllAppsTask().execute("Test AsyncTask",
"Test AsyncTask2","Test AsyncTask3");
2.doInBackground方法中獲取第二個參數的值時,直接params[1]就可以取到,獲取第三個就使用params[2],如下:
protectedLong doInBackground(String... params)
{
//
TODO
Auto-generated method stub
Log.d(TAG,"doInBackground
params[1]="+ params[1]);
publishProgress(10);
return100L;
}
修改之後,運行上面程序,輸出結果:
06-10 14:24:57.834: DEBUG/asynctaskdemo(8269): onPreExecute
06-10 14:24:57.843: DEBUG/asynctaskdemo(8269): doInBackground params[1]=Test AsyncTask2
06-10 14:24:57.926: DEBUG/asynctaskdemo(8269): onProgressUpdate values[0]=10
06-10 14:24:57.926: DEBUG/asynctaskdemo(8269): onPostExecute result=100