AsyncTask一般包括以下幾個步驟:
1.execute(Params... params),執行一個異步任務,需要我們在代碼中調用此方法,觸發異步任務的執行。
2.onPreExecute(),在execute(Params... params)被調用後立即執行,一般用來在執行後臺任務前對UI做一些標記。
3.doInBackground(Params... params),在onPreExecute()完成後立即執行,用於執行較爲費時的操作,此方法將接收輸入參數和返回計算結果。在執行過程中可以調用publishProgress(Progress... values)來更新進度信息。
4.onProgressUpdate(Progress... values),在調用publishProgress(Progress... values)時,此方法被執行,直接將進度信息更新到UI組件上。
5.onPostExecute(Result result),當後臺操作結束時,此方法將會被調用,計算結果將做爲參數傳遞到此方法中,直接將結果顯示到UI組件上。
在使用的時候,有幾點需要格外注意:
1.異步任務的實例必須在UI線程中創建。
2.execute(Params... params)方法必須在UI線程中調用。
3.不要手動調用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)這幾個方法。
4.不能在doInBackground(Params... params)中更改UI組件的信息。
5.一個任務實例只能執行一次,如果執行第二次將會拋出異常。
public class AsyncTaskActivity extends Activity {
private ImageView mImageView;
private Button mButton;
// private ProgressBar mProgressBar;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mImageView= (ImageView) findViewById(R.id.imageView);
mButton = (Button) findViewById(R.id.button);
// mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
LogoTask task = new LogoTask();
task.execute("http://avatar.csdn.net/0/C/6/1_li_zhuonan.jpg");
}
});
}
ProgressDialog mypDialog;
public void show_dialog()
{
mypDialog=new ProgressDialog(this);
//實例化
mypDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
//設置進度條風格,風格爲圓形,旋轉的
mypDialog.setTitle("正在登錄中,請稍後...");
mypDialog.setIndeterminate(false);
//設置ProgressDialog 的進度條是否不明確
mypDialog.setCancelable(true);
//設置ProgressDialog 是否可以按退回按鍵取消
mypDialog.show();
//讓ProgressDialog顯示
}
public void cancel_dialog()
{
mypDialog.dismiss();
}
class LogoTask extends AsyncTask<String,Integer,Bitmap> {//繼承AsyncTask
@Override
protected Bitmap doInBackground(String... params) {//處理後臺執行的任務,在後臺線程執行
// publishProgress(0);//將會調用onProgressUpdate(Integer... progress)方法
HttpClient hc = new DefaultHttpClient();
publishProgress(30);
HttpGet hg = new HttpGet(params[0]);//獲取csdn的logo
final Bitmap bm;
try {
HttpResponse hr = hc.execute(hg);
bm = BitmapFactory.decodeStream(hr.getEntity().getContent());
} catch (Exception e) {
return null;
}
publishProgress(100);
//mImageView.setImageBitmap(result); 不能在後臺線程操作ui
return bm;
}
protected void onProgressUpdate(Integer... progress) {//在調用publishProgress之後被調用,在ui線程執行
// mProgressBar.setProgress(progress[0]);
//更新進度條的進度
if(progress[0]==30)
{
show_dialog();
}
else
{
cancel_dialog();
}
}
protected void onPostExecute(Bitmap result) {//後臺任務執行完之後被調用,在ui線程執行
if(result != null) {
Toast.makeText(AsyncTaskActivity.this, "成功獲取圖片", Toast.LENGTH_LONG).show();
mImageView.setImageBitmap(result);
}else {
Toast.makeText(AsyncTaskActivity.this, "獲取圖片失敗", Toast.LENGTH_LONG).show();
}
}
protected void onPreExecute () {//在 doInBackground(Params...)之前被調用,在ui線程執行
mImageView.setImageBitmap(null);
//mProgressBar.setProgress(0);//進度條復位
}
protected void onCancelled () {//在ui線程執行
//mProgressBar.setProgress(0);//進度條復位
mypDialog.dismiss();
}
}
}
附上demo下載地址:下載網絡圖片