Android 結合實例學會AsyncTask的用法

AsyncTask執行時通過四個步驟,執行四個方法:android

1.onPreExecute(),運行在UI線程,能夠設置或修改UI控件,如顯示一個進度條app

2.doInBackground,運行在後臺線程,不能夠設置或修改UI控件,該方法的執行時機是:
onPreExecute()執行完畢當即調用該方法,在方法中進行耗時操做,能夠在該方法中調用publishProgress方法
來發布當執行的進度,調用publishProgress方法後就會當即觸發onProgressUpdate方法async

3.onProgressUpdate,運行在UI線程,能夠設置或修改UI控件ide

4.onPostExecute,運行在UI線程,能夠設置或修改UI控件,該方法在doInBackground方法執行完畢
後就會調用,該方法的參數就是doInBackground方法返回的結果,能夠這樣思考:doInBackground方法
既然有一個返回結果,那麼這個返回結果到底返回給誰呢?答案就是:經過參數形式傳遞給onPostExecute方法.net


參數說明:
1.doInBackground方法的形參對應的是AsyncTask的第一個參數,即參數類型要相同。doInBackground方法
接收實參的時機是:在UI線程中調用execute方法時爲execute方法設置值,調用execute方法,這個值就會經過參數形式傳給doInBackground方法,doInBackground方法返回的結果對應的是AsyncTask的第三個參數,即參數類型要相同,線程

2.onPostExecute方法的參數值就是doInBackground方法返回的結果傳遞過來的。所以onPostExecute方法的參數
類型與AsyncTask的第三個參數也對應。即相同blog

3.onProgressUpdate方法的參數類型與AsyncTask的第二個參數對應,即參數類型要相同,在doInBackground方法中能夠調用
publishProgress方法將進度值傳遞給onProgressUpdate方法,進度值的類型由AsyncTask的第二個參數類型決定源碼

參數說明小結:
1.AsyncTask的第一個參數類型決定了doInBackground方法、execute方法的參數類型
2.AsyncTask的第二個參數類型決定了publishProgress方法、onProgressUpdate方法的參數類型
3.AsyncTask的第三個參數類型決定了doInBackground方法的返回值類型、onPostExecute方法的參數類型 注:若是不須要參數傳遞,那麼AsyncTask的參數列表能夠寫成:AsyncTaskit

使用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,歡迎轉載,轉載時請註明出處!!) class

展現一個例子: 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): onPreExecute06-10 14:24:57.843: DEBUG/asynctaskdemo(8269): doInBackground params[1]=Test AsyncTask206-10 14:24:57.926: DEBUG/asynctaskdemo(8269): onProgressUpdate values[0]=1006-10 14:24:57.926: DEBUG/asynctaskdemo(8269): onPostExecute result=100

相關文章
相關標籤/搜索