官术网_书友最值得收藏!

Declaring AsyncTask types

AsyncTask is a generically typed class that exposes three generic type parameters:

abstract class AsyncTask<Params, Progress, Result>

In order to use a generic type, we must provide one type argument per type parameter that was declared for the generic type.

Note

The generic type class provides a way to re-use the same generic algorithms for different input types. A generic type could have one or more type parameters.

When we declare an AsyncTask subclass, we'll specify the types for Params, Progress, and Result; for example, if we want to pass a String parameter to doInBackground, report progress as a Float, and return a Boolean result, we would declare our AsyncTask subclass as follows:

    public class MyTask extends AsyncTask<String, Float, Boolean>

If we don't need to pass any parameters, or don't want to report progress, a good type to use for those parameters is java.lang.Void, which signals our intent clearly, because Void is an uninstantiable class representing the void keyword.

Only reference types can be used as type arguments of a generic type. This includes classes, interfaces, enum types, nested and inner types, and array types. Primitive types are not allowed to be used as a type argument. The next declaration is considered illegal on a generic type class definition:

   // Error
   public class MyTask extends AsyncTask<String, float, boolean>

Let's take a look at our first example, performing an expensive image download in the background and reporting the result into the current UI:

public class DownloadImageTask
  extends AsyncTask<URL, Integer, Bitmap> {

  // Weak reference to the UI View to update
  private final WeakReference<ImageView> imageViewRef;

  public DownloadImageTask(ImageView imageView) {
    this.imageViewRef = new WeakReference<ImageView>(imageView);
  }
 
  // Retrieves the image from a URL
  private Bitmap downloadBitmap(URL url) {
    // elided for brevity ...
    ...
  }

  @Override
  protected Bitmap doInBackground(URL... params) {
    URL url = params[0];
    // The IO operation invoked will take a significant ammount
    // to complete
    return downloadBitmap(url);
  }
  ...

  @Override
  protected void onPostExecute(Bitmap bitmap) {
    ImageView imageView = this.imageViewRef.get();
    if (imageView != null) {
      imageView.setImageBitmap(bitmap);
    }
  }
}

Here, DownloadImageTask extends AsyncTask, specifying the Params type as a URL so that we can retrieve an image based on its url, Progress as Integer, and the Result type as Bitmap.

We pass ImageView to the constructor so that DownloadImageTask has a weak reference to the user interface that it should update upon completion.

We've implemented doInBackground to download the image in the background, where url is a URL parameter with the image resource location.

In onPostExecute, when the view weak reference is not null, we simply load the bitmap into the view that we stored in the constructor.

The WeakReference does not prevent the view from being garbage collected when the activity where the view was created is no longer active.

主站蜘蛛池模板: 黄骅市| 桂林市| 桂阳县| 新田县| 安达市| 奉贤区| 尚义县| 罗源县| 溆浦县| 凯里市| 广水市| 蒲城县| 顺义区| 富宁县| 涡阳县| 黔东| 车险| 宜春市| 墨玉县| 安新县| 南华县| 察哈| 彰化县| 新乡县| 金昌市| 依兰县| 赤城县| 昌邑市| 镇江市| 兴城市| 泗水县| 伊吾县| 潼南县| 肇东市| 吉隆县| 海阳市| 涟水县| 武夷山市| 高清| 通化县| 神农架林区|