構建AsyncTask子類的回調方法:
doInBackground:必須重寫,異步執行後臺線程將要完成的任務;
onPreExecute:執行後臺耗時操作前被調用,通常用戶完成一些初始化操作;
onPostExecute:當doInBackground()完成後,系統會自動調用該方法,並將doInBackground方法返回的值傳遞給該方法;
onProgressUpdate:在doInBackground方法中調用publishProgress()方法,更新任務的執行進度後,就會觸發該方法。
public class MyAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
Log.d("abc", "doInBackground");
publishProgress();
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.d("abc", "onPreExecute");
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
Log.d("abc", "onPostExecute");
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
Log.d("abc", "onProgressUpdate");
}
}
其中,doInBackground()方法實現邏輯:
1)從params[]數組中取出相應的值作爲url;
2)訪問網絡操作;
3)將bitmap作爲返回值,返回給後面調用的方法。
AsyncTask調用流程:
在主線程中通過AsyncTask實例調用execute()方法開啓AsyncTask一步到位操作,在execute方法中傳遞一個或多個參數作爲doInBackground()方法中的一個參數;
首先,系統會調用onPreExecute()方法,需要對其進行初始化操作;
接着,調用doInBackground()方法,開始真正異步操作方法,在其進行耗時操作,並將結果返回爲我們指定的類型;
最終,在onPostExecute()方法中獲取到返回的結果,因爲onPostExecute()方法運行在主線程,從而可以對UI進行任意操作。
public class ImageTask extends Activity {
private ImageView imageView;
private ProgressBar progressBar;
private static String URL = "https://img-my.csdn.net/uploads/201504/12/1428806103_9476.png";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.image_task);
imageView = (ImageView) findViewById(R.id.image);
progressBar = (ProgressBar) findViewById(R.id.progressbar);
new MyAsyncTask().execute(URL);// 設置傳遞進去的參數
}
class MyAsyncTask extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... params) {
// 獲取傳遞進來的參數
String url = params[0];// 取出對應URL
Bitmap bitmap = null;
URLConnection connection;// 定義網絡連接的對象
InputStream is;// 用於獲取數據的輸入流
try {// 將url所對應的圖像解析成了bitmap
connection = new URL(url).openConnection();// 獲取網絡連接對象
is = connection.getInputStream();// 獲取輸入流
BufferedInputStream bis = new BufferedInputStream(is);
bitmap = BitmapFactory.decodeStream(bis);// 通過decodeStream將輸入流解析成bitmap
is.close();// 關閉輸入流
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
// 將bitmap作爲返回值
return bitmap;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressBar.setVisibility(View.VISIBLE);// 顯示進度條
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
// 操作UI,設置圖像
progressBar.setVisibility(View.GONE);
imageView.setImageBitmap(bitmap);
}
}
}
編寫xml文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ImageTask" >
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
在MainActivity中設置開始異步操作。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyAsyncTask task = new MyAsyncTask();
task.execute();
}
public void loadImage(View view) {
startActivity(new Intent(this, ImageTask.class));
}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="loadImage"
android:text="Image Test" />
</LinearLayout>
最後,要去清單文件中獲取網絡權限。
<uses-permission android:name="android.permission.INTERNET" />