- Asynchronous Android Programming(Second Edition)
- Helder Vasconcelos
- 454字
- 2021-07-14 10:43:15
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.
- Learn Blockchain Programming with JavaScript
- ASP.NET MVC4框架揭秘
- C語言程序設計(第2 版)
- Apache Spark 2.x Machine Learning Cookbook
- Mastering Natural Language Processing with Python
- Python Game Programming By Example
- PostgreSQL技術內幕:事務處理深度探索
- Java開發入行真功夫
- C語言程序設計同步訓練與上機指導(第三版)
- Visual C++開發入行真功夫
- 運用后端技術處理業務邏輯(藍橋杯軟件大賽培訓教材-Java方向)
- Android移動開發案例教程:基于Android Studio開發環境
- Java RESTful Web Service實戰
- Python面向對象編程(第4版)
- HTML5程序設計基礎教程