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

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.

主站蜘蛛池模板: 桓仁| 平江县| 郁南县| 古蔺县| 大埔县| 时尚| 顺义区| 隆回县| 新乡市| 育儿| 福州市| 屯昌县| 望江县| 京山县| 西贡区| 泽州县| 历史| 漳平市| 大化| 德保县| 海原县| 樟树市| 桦甸市| 沅江市| 盐津县| 鱼台县| 东莞市| 通道| 呼和浩特市| 广安市| 马鞍山市| 天水市| 扎赉特旗| 胶南市| 临汾市| 清丰县| 江孜县| 宁海县| 象州县| 弥勒县| 沂源县|