使用该模块的方法:创建LoadImageAsyncTask对象的时候必须传入一个LoadImageAsyncTaskCallback接口的实现类,实际调用该类的方法来完成加载图片前后的工作.
public class LoadImageAsyncTask extends AsyncTask<String, Void, Bitmap> {
LoadImageAsyncTaskCallback loadImageAsyncTaskCallback;
public LoadImageAsyncTask(LoadImageAsyncTaskCallback loadImageAsyncTaskCallback) {
super();
this.loadImageAsyncTaskCallback = loadImageAsyncTaskCallback;
}
public interface LoadImageAsyncTaskCallback {
public void beforeLoadImage();
public void afterLoadImage(Bitmap bitmap);
}
@Override
protected void onPreExecute() {
loadImageAsyncTaskCallback.beforeLoadImage();
super.onPreExecute();
}
@Override
protected void onPostExecute(Bitmap result) {
loadImageAsyncTaskCallback.afterLoadImage(result);
super.onPostExecute(result);
}
@Override
protected Bitmap doInBackground(String... params) {
if (params.length >= 1) {
try {
String path = params[0];
final File file = new File(Environment.getExternalStorageDirectory()+"/cache", URLEncoder.encode(path));
if (file.exists()) {
FileInputStream is = new FileInputStream(file);
System.out.println("使用SD卡缓存图片");
return BitmapFactory.decodeStream(is);
} else {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
InputStream inputStream = conn.getInputStream();
final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
new Thread(){
@Override
public void run() {
try {
OutputStream stream = new FileOutputStream(file);
bitmap.compress(CompressFormat.JPEG, 100, stream );
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}.start();
System.out.println("使用下载图片");
return bitmap;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
} else {
return null;
}
}
}
图片的软引用: 软引用能够极大地提高加载图片的效率:
private Map<String, SoftReference<Bitmap>> map = new HashMap<String, SoftReference<Bitmap>>();//定义成员变量
//代码中:
if (map.containsKey(imagePath)) {
SoftReference<Bitmap> softReference = map.get(imagePath);
if (softReference != null) {
Bitmap bitmap = softReference.get();
if (bitmap != null) {
System.out.println("使用内存缓存图片");
book_img.setImageBitmap(bitmap);
} else {
loadImage(book_img, imagePath); //使用非软引用方式加载图片.
}
} else {
loadImage(book_img, imagePath);
}
} else {
loadImage(book_img, imagePath);
}
private void loadImage(final ImageView book_img, final String imagePath) {
new LoadImageAsyncTask(new LoadImageAsyncTaskCallback() {
public void beforeLoadImage() {
}
public void afterLoadImage(Bitmap bitmap) {
if (bitmap != null) {
book_img.setImageBitmap(bitmap);
map.put(imagePath, new SoftReference<Bitmap>(bitmap)); //在使用非软引用方式加载图片时,将图片保存到软件引 //用中.
}
}
}).execute(imagePath);
}