AsyncTask<String, Void, Bitmap> 三個類型參數含義:
doInBackground 輸入參數類型,此處為圖片 URL 字符串。onPostExecute 參數類型。public class ImageDownloadTask extends AsyncTask<String, Void, Bitmap> {
private WeakReference<ImageView> imageViewRef;
private ProgressDialog dialog;
public ImageDownloadTask(ImageView imageView, Context context) {
this.imageViewRef = new WeakReference<>(imageView);
this.dialog = new ProgressDialog(context);
}
@Override
protected void onPreExecute() {
dialog.setMessage("圖片加載中...");
dialog.show();
}
@Override
protected Bitmap doInBackground(String... params) {
String urlStr = params[0];
try {
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(10000);
conn.setRequestMethod("GET");
if (conn.getResponseCode() == 200) {
InputStream is = conn.getInputStream();
return BitmapFactory.decodeStream(is);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
dialog.dismiss();
if (bitmap != null && imageViewRef.get() != null) {
imageViewRef.get().setImageBitmap(bitmap);
}
}
}
Activity 銷毀時,AsyncTask 可能仍在運行。持有 WeakReference<ImageView> 避免阻礙 GC 回收 Activity。
// 在 Activity onDestroy 中
if (task != null && task.getStatus() == AsyncTask.Status.RUNNING) {
task.cancel(true); // 中斷網絡請求需在 doInBackground 檢查 isCancelled()
}
預設為串行執行(SerialExecutor)。若需並行下載多張圖:
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, url1, url2);
Google 已在 Android 11 (API 30) 標記 AsyncTask 為過時。推薦使用:
AsyncTask 適合簡單、短暫的後台任務。掌握其生命周期(onPreExecute → doInBackground → onPostExecute)、泛型含義及內存洩漏防範,是 Android 進階的基礎。新項目請優先選用現代異步框架。