Android AsyncTask – Android移動開發技術文章_手機開發 Android移動開發教學課程

在有界面的Android應用中,後臺異步執行一些事情是常見的場景,這時候我們從底層開始寫起的話,就需要瞭解比較深層的東西,比如這篇文章“Android 的消息隊列模型”提到的Looper、Handler、Message、MessageQueue。


Android為瞭降低這個開發難度,提供瞭AsyncTask。AsyncTask就是一個封裝過的後臺任務類,顧名思義就是異步任務。


AsyncTask直接繼承於Object類,位置為android.os.AsyncTask。要使用AsyncTask工作我們要提供三個泛型參數,並重載幾個方法(至少重載一個)。


 


AsyncTask定義瞭三種泛型類型 Params,Progress和Result。


Params 啟動任務執行的輸入參數,比如HTTP請求的URL。
Progress 後臺任務執行的百分比。
Result 後臺執行任務最終返回的結果,比如String。
使用過AsyncTask 的同學都知道一個異步加載數據最少要重寫以下這兩個方法:


doInBackground(Params…) 後臺執行,比較耗時的操作都可以放在這裡。註意這裡不能直接操作UI。此方法在後臺線程執行,完成任務的主要工作,通常需要較長的時間。在執行過程中可以調用publicProgress(Progress…)來更新任務的進度。
onPostExecute(Result)  相當於Handler 處理UI的方式,在這裡面可以使用在doInBackground 得到的結果處理操作UI。 此方法在主線程執行,任務執行的結果作為此方法的參數返回
有必要的話你還得重寫以下這三個方法,但不是必須的:


onProgressUpdate(Progress…)   可以使用進度條增加用戶體驗度。 此方法在主線程執行,用於顯示任務執行的進度。
onPreExecute()        這裡是最終用戶調用Excute時的接口,當任務執行之前開始調用此方法,可以在這裡顯示進度對話框。
onCancelled()             用戶調用取消時,要做的操作
使用AsyncTask類,以下是幾條必須遵守的準則:


Task的實例必須在UI thread中創建;
execute方法必須在UI thread中調用;
不要手動的調用onPreExecute(), onPostExecute(Result),doInBackground(Params…), onProgressUpdate(Progress…)這幾個方法;
該task隻能被執行一次,否則多次調用時將會出現異常;
一個超簡單的理解 AsyncTask 的例子:


這個例子後臺sleep一定時間後更新前段進度條的進度,當完成後把進度條隱藏掉。


layout 文件


1.0″ encoding=”utf-8″?>
http://schemas.android.com/apk/res/android”
 android:orientation=”vertical” android:layout_width=”fill_parent”
 android:layout_height=”fill_parent”>
 @+id/progress_bar”
  android:layout_width=”200dip” android:layout_height=”200dip”
  android:layout_gravity=”center” android:max=”100″ android:progress=”0″>
 
代碼文件


package ghj1976.AsyncTask;


import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ProgressBar;


public class AsyncTaskActivity extends Activity {


 public ProgressBar pBar;


 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);


  pBar = (ProgressBar) findViewById(R.id.progress_bar);
  // AsyncTask.execute()要在主線程裡調用
  new AsyncLoader().execute((Void) null);
 }


 // 設置三種類型參數分別為 Params = Void, Progress = Integer,Result = Void
 class AsyncLoader extends AsyncTask {
  @Override
  protected Void doInBackground(Void… params) {
   publishProgress(0);
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   publishProgress(50);
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   publishProgress(100);
   return null;
  }


  @Override
  protected void onPostExecute(Void v) {
   pBar.setVisibility(View.INVISIBLE);
  }


  @Override
  protected void onProgressUpdate(Integer… values) {
   pBar.setProgress(values[0]);
  }


 }
}
說明: 


JAVA中類型後面跟三個點,表示的是可變數組參數 


/kf/201105/89976.html


 

You May Also Like