Android AsyncTask使用詳解

shunji2099發表於2017-02-26

宣告:本文是shunWang原創文章,轉載請註明出處:  http://shunji.wang/2017/02/26/asynctask/ ‎

要知道怎麼使用AsyncTask首先得知道何為AsyncTask以及AsyncTask的作用,AsyncTask譯成中文就是非同步任務,在其內部封裝了Handler機制,主要用來實現子錢程與UI執行緒的協同工作,比如子執行緒通知UI執行緒更新介面,所以AsyncTask的實質就是Google給我們封裝好的Handler機制。

第一步:繼承

AsyncTask是泛型抽象類,在使用前需要先建立一個類繼承該抽象類,並實現其抽象方法。

public abstract class AsyncTask<Params, Progress, Result>
     引數說明:
     Params:啟動AsyncTask時傳入的資料型別(可為Void);
     Progerss:表示進度的資料型別(可為Void);
     Result:任務執行完畢後返回的資料型別(可為Void);


第二步:實現抽象方法doInBackground;
     @Override
    protected Object doInBackground(Object[] objects) {
    return null;
      }


第三步:重寫三個方法,這四個方法的作用後面一點說,先說步驟;
@Override
protected void onPreExecute() {
    super.onPreExecute();
}

@Override
protected void onProgressUpdate(Object[] values) {
    super.onProgressUpdate(values);
}

@Override
protected void onPostExecute(Object o) {
    super.onPostExecute(o);
}

這四個方法的執行順序見下圖:


方法說明:
onPreExecute():在非同步任務執行前被呼叫,做準備工作;
doInBackground():執行後臺任務,返回結果由onProgressUpdate()接收(注意此方法是在子執行緒中執行);
onProgressUpdate():後臺任務執行過程中呼叫publishProgress()方法更新任務進度時被呼叫;
onPostExecute():當後臺任務執行完之後被呼叫,用於返回結果;


第四步:呼叫AsyncTask的例項方法execute()執行一個非同步任務


任務的終止:
@Override
protected void onCancelled() {
    super.onCancelled();
}
廢話就只說這麼多了,最後上完整的程式碼供大家參考:

public class MainActivity extends AppCompatActivity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 }

 public void myClick(View view) {

 //建立非同步任務並執行,引數傳遞給後臺任務doInBackground
 new MyAsync().execute(1,2,3,4,5,6);
    }

 class MyAsync extends AsyncTask<Integer,Integer,Bitmap>{

 private ImageView imageView;
 private ProgressDialog dialog;

 //在非同步任務執行之前被呼叫,做準備工作。(被UI執行緒呼叫)
 @Override
 protected void onPreExecute() {
 super.onPreExecute();
 Log.d("FSLog","onPreExecute");

 imageView = (ImageView) findViewById(R.id.imageView);

 dialog = new ProgressDialog(MainActivity.this);
 dialog.setMax(100);
 dialog.setTitle("正在下載。。。");
 dialog.show();
     }

 //執行後臺任務 (後臺執行緒呼叫)
 @Override
 protected Bitmap doInBackground(Integer... params) {

 Log.d("FSLog","doInBackground" + params[2]);

 //publishProgress(100);這裡呼叫這個方法就會觸發onProgressUpdate()

 HttpURLConnection conn = null;
 InputStream fis = null;
 Bitmap bitmap = null;
 try {
 URL url = new URL("http://192.168.1.104:8080/HttpUrlConnectionServer/TomCat.jpg");

 conn = (HttpURLConnection) url.openConnection();

 conn.setRequestMethod("GET");
 conn.setReadTimeout(3000);
 conn.setConnectTimeout(3000);
 conn.setDoOutput(false);
 conn.setDoInput(true);
 conn.setUseCaches(true);
 conn.connect();

 if(!(conn.getResponseCode() == HttpURLConnection.HTTP_OK))
   {
 return null;
        }

 fis = conn.getInputStream();

 bitmap = BitmapFactory.decodeStream(fis);

 } catch (Exception e) {
 e.printStackTrace();

 if(fis != null)
 {
 try {
 fis.close();
 } catch (IOException e1) {
 e1.printStackTrace();
    }
 }
 if(conn != null) {
 conn.disconnect();
    }
 }
 return bitmap;
 }

 //當後臺任務執行完之後被呼叫,用於返回結果 更新UI (被UI執行緒呼叫)
 @Override
 protected void onPostExecute(Bitmap bitmap) {
 super.onPostExecute(bitmap);
 Log.d("FSLog","onPostExecute");

 imageView.setImageBitmap(bitmap);

 dialog.dismiss();
 }

 //後臺任務執行過程中呼叫publishProgress()方法更新任務的進度時,被呼叫 (被UI執行緒呼叫)
 @Override
 protected void onProgressUpdate(Integer... values) {
 super.onProgressUpdate(values);
 Log.d("FSLog","onProgressUpdate" + values[0]);
     }
   }
}

相關文章