package com.su.doubanrise.widget;
import java.io.File;
import java.lang.ref.SoftReference;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;
import com.su.doubanrise.DoubanApp;
import com.su.doubanrise.R;
import com.su.doubanrise.overall.Constant;
import com.su.doubanrise.util.FileDownLoader;
import com.su.doubanrise.util.Str;
public class AsyncImageLoader {
//TODO Remove the callback ,set imageView in function.
//TODO Add Thread Pool Reference:OscChina BitmapManager
//TODO Adapter convertview reuse
private Context mcontext;
private HashMap<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>();
private static Map<ImageView, String> imageViews;
private Bitmap defbitmap;;
public AsyncImageLoader() {
this.mcontext = DoubanApp.getContext();
defbitmap = BitmapFactory.decodeResource(mcontext.getResources(),
R.drawable.ic_launcher);
imageViews = Collections
.synchronizedMap(new WeakHashMap<ImageView, String>());
}
/**
* 异步加载sd卡的图片 ,
*
* @param uri
* @param imageView
* @param imageCallback
* @return
*/
private Bitmap loadBitmapFromSD(final String uri,
final ImageView imageView, final ImageCallback imageCallback) {
if (imageCache.containsKey(uri)) {
SoftReference<Bitmap> SoftReference = imageCache.get(uri);
Bitmap bitmap = SoftReference.get();
if (bitmap != null) {
return bitmap;
}
}
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
imageCallback.imageLoaded((Bitmap) msg.obj, imageView, uri);
}
};
new Thread() {
public void run() {
Bitmap bitmap = null;
bitmap = getBitmapFromFile(uri);
imageCache.put(uri, new SoftReference<Bitmap>(bitmap));
if (!new File(uri).isFile()) {
bitmap = BitmapFactory.decodeResource(
mcontext.getResources(), R.drawable.ic_launcher);
}
Message msg = handler.obtainMessage(0, bitmap);
handler.sendMessage(msg);
bitmap = null;
}
}.start();
return defbitmap;
}
/**
* 异步加载Net上的图片 ,
*
* @param url
* @param imageView
* @param imageCallback
* @return
*/
private Bitmap loadBitmapFromNet(final String url,
final ImageView imageView, final int opsize,
final ImageCallback imageCallback) {
imageViews.put(imageView, url);
final String savePath = Constant.PICPATH + Str.md5(url);
if (imageCache.containsKey(url)) {
Bitmap bitmap = imageCache.get(url).get();
if (bitmap != null) {
return bitmap;
}
}
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
String tag = imageViews.get(imageView);
if (tag != null && tag.equals(url)) {
imageCallback.imageLoaded((Bitmap) msg.obj, imageView, url);
}
}
};
new Thread() {
public void run() {
try {
FileDownLoader.downloadImg(url, savePath);
} catch (Exception e) {
e.printStackTrace();
}
Bitmap bitmap = null;
bitmap = getBitmapFromFile(savePath, opsize);
imageCache.put(url, new SoftReference<Bitmap>(bitmap));
if (bitmap != null) {
Message msg = handler.obtainMessage(0, bitmap);
handler.sendMessage(msg);
}
}
}.start();
return defbitmap;
}
private interface ImageCallback {
public void imageLoaded(Bitmap imageBitmap, ImageView imageView,
String uri);
}
/**
* 从本读读取图片
*
* @param uri
* @return
*/
private Bitmap getBitmapFromFile(String uri) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 8;
Bitmap bitmap = BitmapFactory.decodeFile(uri, options);
return bitmap;
}
/**
* 从本读读取图片 添加opt参数
*
* @param uri
* @return
*/
private Bitmap getBitmapFromFile(String uri, int opsize) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = opsize;
options.inPurgeable = true;
Bitmap bitmap = BitmapFactory.decodeFile(uri, options);// 这里还是会出现oom??
return bitmap;
}
/**
* 最终暴露给用户的接口
*
* @param url
* @param imageView
*/
public void setAsyncBitmapFromNet(String url, ImageView imageView) {
if (url == null) {
return;
}
imageView.setImageBitmap(loadBitmapFromNet(url, imageView, 1,
new ImageCallback() {
public void imageLoaded(Bitmap imageBitmap,
ImageView imageView, String imageUrl) {
imageView.setImageBitmap(imageBitmap);
}
}));
}
/**
* 异步加载本地图片
*
* @param uri
* @param imageView
*/
public void setAsyncBitmapFromSD(String uri, ImageView imageView) {
if (uri == null) {
return;
}
imageView.setImageBitmap(loadBitmapFromSD(uri, imageView,
new ImageCallback() {
public void imageLoaded(Bitmap imageBitmap,
ImageView imageView, String imageUrl) {
imageView.setImageBitmap(imageBitmap);
}
}));
}
/**
* 由于加载本地图片时间较短 ,其实可以使用这个方法减小线程的开销
*
* @param uri
* @param imageView
*/
public void setBitmapFromSD(String uri, ImageView imageView) {
if (uri == null) {
return;
}
imageView.setImageBitmap(getBitmapFromFile(uri));
}
}
实现异步加载本地图片,防止oom错误
最新推荐文章于 2019-05-08 15:13:56 发布