整理这篇博客的后面部分的代码,凑手重新梳理一下AsyncTask的流程
/**
* 所有的图片处理
*
* @author Administrator
*
*/
public class PicAllActivity extends Activity {
private ImageView pic_image, pic_image2;
private LruCache mMemoryCache = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.picall);
init();
// 获取到可用内存的最大值,使用内存超出这个值会引起OutOfMemory异常。
// LruCache通过构造函数传入缓存值,以KB为单位。
int maxMemory2 = (int) (Runtime.getRuntime().maxMemory() / 1024);
// 使用最大可用内存值的1/8作为缓存的大小。
int cacheSize = maxMemory2 / 8;
mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
// 重写此方法来衡量每张图片的大小,默认返回图片数量。
return bitmap.getRowBytes() * bitmap.getHeight() / 1024;
}
};
loadBitmap(R.drawable.pic12, pic_image2);
}
private void init() {
pic_image2 = (ImageView) findViewById(R.id.pic_image2);
}
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
if (getBitmapFromMemCache(key) == null) {
mMemoryCache.put(key, bitmap);
}
}
public Bitmap getBitmapFromMemCache(String key) {
return (Bitmap) mMemoryCache.get(key);
}
public void loadBitmap(int resId, ImageView imageView) {
final String imageKey = String.valueOf(resId);
final Bitmap bitmap = getBitmapFromMemCache(imageKey);
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
} else {
imageView.setImageResource(R.drawable.left_touxiang);
BitmapWorkerTask task = new BitmapWorkerTask(imageView);
task.execute(resId);
}
}
class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
private ImageView mImageView;
public BitmapWorkerTask(ImageView imageView) {
mImageView = imageView;
}
/**
* 第一
*
* 这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。
*/
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
/**
* 第二
*
* 在后台加载图片。
*/
@Override
protected Bitmap doInBackground(Integer... params) {
final Bitmap bitmap = ImageTools2.decodeSampledBitmapFromResource(getResources(), params[0], 100, 100);
addBitmapToMemoryCache(String.valueOf(params[0]), bitmap);
// publishProgress(values);//更新进度
return bitmap;
}
/**
* 第三
*
*
* 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
*/
@Override
protected void onProgressUpdate(Void... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
}
/**
* 第四
*
*
* 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。
* 此方法在主线程执行,任务执行的结果作为此方法的参数返回
*/
@Override
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
mImageView.setImageBitmap(result);
super.onPostExecute(result);
}
/**
*
*
* 用户调用取消时,要做的操作
*/
@Override
protected void onCancelled() {
// TODO Auto-generated method stub
super.onCancelled();
}
}
}
XML文件就是一个简单的ImageView控件。