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

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.

主站蜘蛛池模板: 乌兰察布市| 博客| 太仓市| 大邑县| 江安县| 托克托县| 辽宁省| 康平县| 荔浦县| 高唐县| 宁南县| 郓城县| 阿尔山市| 太白县| 郑州市| 潞西市| 涡阳县| 冕宁县| 融水| 社旗县| 通州区| 东明县| 开远市| 二连浩特市| 湘阴县| 金寨县| 新兴县| 乌苏市| 唐海县| 通州市| 和龙市| 察雅县| 通道| 阿克苏市| 上栗县| 绥宁县| 得荣县| 边坝县| 南澳县| 全州县| 石阡县|