package com.partynetwork.iparty.app.common;
import java.io.File;
import java.io.IOException;
import java.lang.ref.SoftReference;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.lidroid.xutils.bitmap.BitmapDisplayConfig;
import com.lidroid.xutils.bitmap.callback.BitmapLoadCallBack;
import com.lidroid.xutils.bitmap.callback.BitmapLoadFrom;
import com.partynetwork.iparty.app.AppContext;
import com.partynetwork.iparty.app.AppException;
import com.partynetwork.iparty.app.api.ApiClient;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.widget.ImageView;
/**
* 异步线程加载图片工具类 使用说明: BitmapManager bmpManager; bmpManager = new
* BitmapManager(BitmapFactory.decodeResource(context.getResources(),
* R.drawable.loading)); bmpManager.loadBitmap(imageURL, imageView);
*
* @author liux (http://my.oschina.net/liux)
* @version 1.0
* @created 2012-6-25
*/
public class BitmapManager {
private static HashMap<String, SoftReference<Bitmap>> cache;
private static ExecutorService pool;
private static Map<ImageView, String> imageViews;
private Bitmap defaultBmp;
static {
cache = new HashMap<String, SoftReference<Bitmap>>();
pool = Executors.newFixedThreadPool(5); // 固定线程池
imageViews = Collections
.synchronizedMap(new WeakHashMap<ImageView, String>());
}
public BitmapManager() {
}
public BitmapManager(Bitmap def) {
this.defaultBmp = def;
}
/**
* 设置默认图片
*
* @param bmp
*/
public void setDefaultBmp(Bitmap bmp) {
defaultBmp = bmp;
}
/**
* 加载图片
*
* @param url
* @param imageView
*/
public void loadBitmap(String url, ImageView imageView) {
AppContext.getInstance().getBitmapUtils().display(imageView, url);
// ImageLoader.getInstance().displayImage(url, imageView);
// loadBitmap(url, imageView, this.defaultBmp, 0, 0);
}
/**
* 加载图片-可设置加载失败后显示的默认图片
*
* @param url
* @param imageView
* @param defaultBmp
*/
public void loadBitmap(String url, ImageView imageView, Bitmap defaultBmp) {
loadBitmap(url, imageView, defaultBmp, 0, 0);
}
/**
* 加载图片-可指定显示图片的高宽
*
* @param url
* @param imageView
* @param width
* @param height
*/
public void loadBitmap(String url, ImageView imageView, Bitmap defaultBmp,
int width, int height) {
imageViews.put(imageView, url);
Bitmap bitmap = getBitmapFromCache(url);
if (bitmap != null) {
// 显示缓存图片
imageView.setImageBitmap(bitmap);
} else {
// 加载SD卡中的图片缓存
String filename = FileUtils.getFileName(url);
String filepath = imageView.getContext().getFilesDir()
+ File.separator + filename;
File file = new File(filepath);
if (file.exists()) {
// 显示SD卡中的图片缓存
Bitmap bmp = ImageUtils.getBitmap(imageView.getContext(),
filename);
imageView.setImageBitmap(bmp);
} else {
// 线程加载网络图片
imageView.setImageBitmap(defaultBmp);
queueJob(url, imageView, width, height);
}
}
}
/**
* 从缓存中获取图片
*
* @param url
*/
public Bitmap getBitmapFromCache(String url) {
Bitmap bitmap = null;
if (cache.containsKey(url)) {
bitmap = cache.get(url).get();
}
return bitmap;
}
/**
* 从网络中加载图片
*
* @param url
* @param imageView
* @param width
* @param height
*/
public void queueJob(final String url, final ImageView imageView,
final int width, final int height) {
BitmapLoadCallBack<ImageView> listener = new BitmapLoadCallBack<ImageView>() {
@Override
public void onLoadFailed(ImageView arg0, String arg1, Drawable arg2) {
// TODO 自动生成的方法存根
}
@Override
public void onLoadCompleted(ImageView arg0, String arg1,
Bitmap arg2, BitmapDisplayConfig arg3, BitmapLoadFrom arg4) {
try {
ImageUtils.saveImage(arg0.getContext(), arg1, arg2);
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
};
AppContext.getInstance().getBitmapUtils()
.display(imageView, url, listener);
}
/**
* 下载图片-可指定显示图片的高宽
*
* @param url
* @param width
* @param height
*/
private Bitmap downloadBitmap(String url, int width, int height) {
Bitmap bitmap = null;
try {
// http加载图片
bitmap = ApiClient.getNetBitmap(url);
if (width > 0 && height > 0) {
// 指定显示图片的高宽
bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);
}
// 放入缓存
cache.put(url, new SoftReference<Bitmap>(bitmap));
} catch (AppException e) {
e.printStackTrace();
}
return bitmap;
}
}