如果加载图片时,使用的图片数据源不是来自于内存,而是来自硬盘或网络时,一般不会再UI线程执行图片加载操作。
图片的加载速度取决于很多方面(往往具有不可预测性),比如:硬盘或者网络的读写速度、图片大小、CPU执行速度等待...
如果在UI线程执行图片加载操作,很可能会导致ANR。
因此,可以在后台执行图片加载操作。
方法一:使用AsyncTask执行后台图片加载
public class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
private final WeakReference<ImageView> imageViewReference;
private int data = 0;
public BitmapWorkerTask(ImageView imageView) {
// Use a WeakReference to ensure the ImageView can be garbage
// collected
imageViewReference = new WeakReference<ImageView>(imageView);
}
@Override
protected Bitmap doInBackground(Integer... params) {
// 图片资源ID
data = params[0];
// 局限性在于:调用了getResources()
return UtilTools.decodeSampleBitmatFromResource(getResources(),
data, 100, 100);
}
@Override
protected void onPostExecute(Bitmap result) {
if (imageViewReference != null && result != null) {
final ImageView imageView = imageViewReference.get();
if (imageView != null) {
imageView.setImageBitmap(result);
}
}
}
}
其中,doInBackground()在子线程(background Thread)中执行,onPostExecute()则是在UI线程执行。
/**
* <功能描述> 执行加载Bitmap
*
* @param resId 资源ID
* @param imageView [参数说明] 控件
* @return void [返回类型说明]
*/
private void loadBitmap(int resId, ImageView imageView) {
BitmapWorkerTask task = new BitmapWorkerTask(imageView);
task.execute(resId);
}
执行 task.execute(resId) 时,其参数实际上是Params。
上述即实现了,状态后台线程中加载Bitmap,并在加载完成后显示到UI上的功能。