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; } }