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

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.

主站蜘蛛池模板: 沛县| 会昌县| 普兰县| 浑源县| 南华县| 阿合奇县| 炉霍县| 巨野县| 新安县| 淮滨县| 元谋县| 平定县| 恩施市| 玉环县| 米林县| 呼伦贝尔市| 新昌县| 武胜县| 本溪| 曲松县| 金华市| 安陆市| 丘北县| 新巴尔虎右旗| 城固县| 龙海市| 黔江区| 图片| 东乌珠穆沁旗| 星子县| 鹤山市| 来宾市| 同心县| 靖州| 望江县| 沭阳县| 平度市| 安庆市| 金华市| 普陀区| 北安市|