private class DownloadImageTask extends AsyncTask {
/** 系统把给予AsyncTask.execute() 的参数传给这个方法并且在后台线程中调用这个方法完成工作*/
protected Bitmap doInBackground(String... urls) {
return loadImageFromNetwork(urls[0]);
}
/** 系统把doInBackground()的执行结果传送过来并且在界面线程中调用这个方法执行任务 */
protected void onPostExecute(Bitmap result) {
mImageView.setImageBitmap(result);
}
}
现在界面变得安全并且代码变得简单了。因为把工作分成了在工作线程中完成的部分和在界面线程中完成的部分。
你应该阅读AsyncTask的参考来完全理解如何使用这个类。这里是一个对它如何工作的概览:
你可以使用范型指定参数的类型,进度值,和任务的最终值。
方法doInBackground()自动在工作线程中执行
onPreExecute(),onPostExecute(),和onProgressUpdate()都在界面线程中执行
doInBackground()返回的值被传递到onPostExecute()
你可以在任何时刻在doInBackground()中调用publishProgress()引起在界面线程中执行onProgressUpdate()
你可以在任意时刻在任何线程中取消任务
警告:另一个你在使用工作线程时可能遇到的问题是activity的意外重启(比如屏幕的方向变了),这可能销毁你的工作线程。要了解如何才能在此类现象发生时避免你的任务被杀以及如何在activity死亡时正确的取消你的任务,请参阅Shelves例子的源码。