AsyncTask: 异步封装的工具, 可以实现异步请求及主界面更新(对线程池+handler的封装)
三个泛型意义:
第一个泛型:doInBackground里的参数类型
第二个泛型:onProgressUpdate里的参数类型
第三个泛型:onPostExecute里的参数类型及doInBackground的返回类型
示例:(解决图片错位问题)
class BitmapTask extends AsyncTask<Object, Integer, Bitmap> {
private ImageView imageView;
private String url;
// 1.预加载, 运行在主线程
@Override
protected void onPreExecute() {
super.onPreExecute();
}
// 2.正在加载, 运行在子线程(核心方法), 可以直接异步请求
@Override
protected Bitmap doInBackground(Object... params) {
imageView = (ImageView) params[0];
url = (String) params[1];
imageView.setTag(url);// 打标记, 将当前imageview和url绑定在了一起
// 开始下载图片
Bitmap bitmap = download(url);
// publishProgress(values) 调用此方法实现进度更新(会回调onProgressUpdate)
return bitmap;
}
// 3.更新进度的方法, 运行在主线程
@Override
protected void onProgressUpdate(Integer... values) {
// 更新进度条
super.onProgressUpdate(values);
}
// 4.加载结束, 运行在主线程(核心方法), 可以直接更新UI
@Override
protected void onPostExecute(Bitmap result) {
// System.out.println("onPostExecute");
if (result != null) {
// 给imageView设置图片
// 由于listview的重用机制导致imageview对象可能被多个item共用,
// 从而可能将错误的图片设置给了imageView对象
// 所以需要在此处校验, 判断是否是正确的图片
String url = (String) imageView.getTag();
if (url.equals(this.url)) {// 判断图片绑定的url是否就是当前bitmap的url,
// 如果是,说明图片正确
imageView.setImageBitmap(result);
System.out.println("从网络加载图片啦!!!");
// 写本地缓存
mLocalCacheUtils.setLocalCache(url, result);
// 写内存缓存
mMemoryCacheUtils.setMemoryCache(url, result);
}
}
super.onPostExecute(result);
}
}
1.浅谈AsyncTask
最新推荐文章于 2024-07-28 22:57:09 发布