基本概念
AsyncTask:異步任務,從字面上來說,就是在我們的UI主線程運行的時候,異步的完成一些操作。AsyncTask允許我們的執行一個異步的任務在后臺。我們可以將耗時的操作放在異步任務當中來執行,并隨時將任務執行的結果返回給我們的UI線程來更新我們的UI控件。通過AsyncTask我們可以輕松的解決多線程之間的通信問題。
怎么來理解AsyncTask呢?通俗一點來說,AsyncTask就相當于Android給我們提供了一個多線程編程的一個框架,其介于Thread和Handler之間,我們如果要定義一個AsyncTask,就需要定義一個類來繼承AsyncTask這個抽象類,并實現其唯一的一個 doInBackgroud 抽象方法。要掌握AsyncTask,我們就必須要一個概念,總結起來就是: 3個泛型,4個步驟。
3個泛型指的是什么呢?我們來看看AsyncTask這個抽象類的定義,當我們定義一個類來繼承AsyncTask這個類的時候,我們需要為其指定3個泛型參數:
AsyncTask <Params, Progress, Result>
我們在定義一個類繼承AsyncTask類的時候,必須要指定好這三個泛型的類型,如果都不指定的話,則都將其寫成Void,例如:
AsyncTask <Void, Void, Void>
4個步驟:當我們執行一個異步任務的時候,其需要按照下面的4個步驟分別執行
為什么我們的AsyncTask抽象類只有一個 doInBackground 的抽象方法呢??原因是,我們如果要做一個異步任務,我們必須要為其開辟一個新的Thread,讓其完成一些操作,而在完成這個異步任務時,我可能并不需要彈出要給ProgressDialog,我并不需要隨時更新我的ProgressDialog的進度條,我也并不需要將結果更新給我們的UI界面,所以除了doInBackground 方法之外的三個方法,都不是必須有的,因此我們必須要實現的方法是 doInBackground 方法。
 實例
下面實現一個打開網絡圖片的demo:
package com.app.main; import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.util.EntityUtils; import android.annotation.SuppressLint;import android.app.Activity;import android.app.ProgressDialog;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView; public class Main extends Activity {   String url = "http://e.hiphotos.baidu.com/image/w%3D2048/sign=61711bd121a446237ecaa262ac1a730e/e850352ac65c10385f10af69b3119313b07e892a.jpg";  ImageView imgView = null;  Button btn = null;  ProgressDialog dialog = null;   @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);     imgView = (ImageView) this.findViewById(R.id.imageview);    btn = (Button) this.findViewById(R.id.btn);    dialog = new ProgressDialog(this);    dialog.setMessage("下載圖片中......");     btn.setOnClickListener(new OnClickListener() {       @Override      public void onClick(View view) {         new MyTask().execute(url);      }     });   }   class MyTask extends AsyncTask<String, Void, Bitmap> {     @Override    protected void onPreExecute() {       super.onPreExecute();       dialog.show();     }     @Override    protected Bitmap doInBackground(String... params) {       Bitmap bitmap = null;       String url = params[0];       HttpClient client = new DefaultHttpClient();       HttpGet getMethod = new HttpGet(url);       try {         HttpResponse response = client.execute(getMethod);         if (response.getStatusLine().getStatusCode() == 200) {          HttpEntity entity = response.getEntity();           byte[] data = EntityUtils.toByteArray(entity);           bitmap = BitmapFactory              .decodeByteArray(data, 0, data.length);         }       } catch (Exception e) {       }       return bitmap;    }     @SuppressLint("NewApi")    @Override    protected void onPostExecute(Bitmap result) {       super.onPostExecute(result);       imgView.setImageBitmap(result);       dialog.dismiss();    }   } }實現的效果如圖:

新聞熱點
疑難解答