本文转自Google Android官网文档翻译
AsyncTask可以让程序进行异步工作,它在一个线程中执行某些操作,之后将结果返回给UI线程。
使用AsyncTask类时,你需要继承AsyncTask类并实现doInBackground()回调方法。要更新UI界面,需要实现onPostExecute(),并从doInBackground()方法中获得结果,最后,你可以在UI线程中调用execute()方法来执行操作,这样就可以安全的更新UI界面。例如,我们用AsynTask来实现上面的示例:
public void onClick(View v) {
new DownloadImageTask().execute("http://example.com/image.png");
}
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
/** 该方法运行在后台线程中。参数来自AsyncTask.execute()方法,
*这里将主要负责执行那些很耗时的后台处理工作。*/
protected Bitmap doInBackground(String... urls) {
return loadImageFromNetwork(urls[0]);
}
/** 后台的计算结果将通过该方法传递到UI 线程,并且在界面上展示给用户*/
protected void onPostExecute(Bitmap result) {
mImageView.setImageBitmap(result);
}
}
因为AsyncTask将工作分成了两部分,UI线程和工作线程都做自己应该做的那部分任务,因此我们就可以简单的实现一个安全的UI更新任务了。
更多关于AsyncTask的说明请参看AsyncTask类的参考,这里简单介绍下它是如何工作的:
- AsyncTask定义了三种泛型类型 Params,Progress和Result。Params是启动任务执行的输入参数,比如HTTP请求的URL。Progress是后台任务执行的百分比。Result是后台执行任务最终返回的结果,比如String,Integer等。
- doInBackground()会在工作线程中自动执行。
- onPreExecute(), onPostExecute(), and onProgressUpdate()这三个方法都是在UI线程中调用。
- doInBackground()方法返回的值会传递给onPostExecute()方法。
- 你可以在doInBackground()方法中随时调用publishProgress()方法以此在UI线程中更新执行进度。
- 你可以随时在任何线程中取消任务。