Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 結合實例學會AsyncTask的用法

Android 結合實例學會AsyncTask的用法

日期:2017/2/23 16:48:28      編輯:關於Android編程

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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved