在Android中,應用程序組件啟動沒有運行時,Android系統將打開新的線程供應用程序組件執行,所以今天武林使用頻道小編就給大家詳解Android App中的AsyncTask異步任務執行方式。
基本概念
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(); } } }實現的效果如圖:

本次是武林技術頻道小編給大家帶來的詳解Android App中的AsyncTask異步任務執行方式,希望這篇文章可以幫助到那些想要在網上學習的朋友們。
新聞熱點
疑難解答