一、異步任務介紹
多線程程式設計Handler重新整理UI界面這是我們之前學習的一種利用多線程的方式,通過子線程向主線程發送消息的方式實作的UI界面的重新整理,實際上為解決UI的界面重新整理問題,Android提供了好幾種方案比如:View.post、View.postDelayed、Activity.runOnUiThread。但是上面的方法都比較麻煩,而異步任務(AsyncTask)作為Handler的封裝類,正好可以簡化這種操作。
異步任務的實作原理也是基于異步消息處理機制的,就是我們在多線程程式設計Handler中所介紹的Message、MessageQueue、Handler、Looper。
二、Async的參數和方法
1、參數
AsyncTask是一個抽象類,我們需要一個class去繼承,下面我們來看下傳遞參數。
class Async extends AsyncTask<Params, Progress, Result>{}
1、Params:啟動任務執行傳入參數的類型(用于doInBackground()(背景任務)的參數)
2、Progress:背景任務執行時,如果需要在界面上顯示目前的進度,則使用這裡指定的泛型作為進度機關。(泛型不能使用簡單資料類型)
3、Result:當任務執行完畢後如果需要對結果執行傳回,傳回的就是這個類型的參數
2、方法
1、onPreExcute():該方法在背景任務開始執行之前調用該方法,可以用于初始化界面。
1、doInBackground(Params…):這個方法的所有代碼都會在子線程中運作,我們應該在這裡處理所有的耗時任務。任務一旦完成可以通過return語句來将任務的執行結果傳回。注意:在這個方法裡不可以進行更新UI的操作,如果需要更新UI元素,可以調用publishProgress(progress)。
2、onProgressUpdate(Progress…values):當在背景任務中調用了publishProgress(progress)方法之後,這個方法很快就會被調用,方法中攜帶的參數就是背景運作傳遞過來的。
3、onPostExecute(Result…values):當任務執行完畢并通過return語句進行傳回時,就會調用這個方法。可以利用一些傳回資料進行更新UI。
三、使用範例
使用步驟
1、寫一個繼承AsyncTask的class
2、在該class中通過onProgressUpdate重新整理界面
3、在Activity中調用通過new AsyncTask().execute();
思路
代碼
package com.example.myasynctask;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
public class MainActivity extends Activity
private Button mbtn_start;
private ProgressBar mprogressbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mbtn_start=(Button) findViewById(R.id.mbtn);
mprogressbar=(ProgressBar) findViewById(R.id.progressbar);
mbtn_start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
MyTask mytask=new MyTask();
mytask.execute();
}
});
}
class MyTask extends AsyncTask<Integer, Integer, String>{
protected String doInBackground(Integer... params) {
int count=0;
while(count<101){
count++;
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
publishProgress(count);//更新UI界面
}
return "已經完成";
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
mbtn_start.setText(result);
}
@Override
protected void onProgressUpdate(Integer... values) {
// int count=Integer.parseInt(values[0]);
// mprogressbar.setProgress(count);
int count=values[0];
mprogressbar.setProgress(count);
super.onProgressUpdate(values);
}
}
}