package com.mogujie.tt.adapter.album; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.lang.ref.SoftReference; import java.util.HashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Handler; import android.text.TextUtils; import android.widget.ImageView; import com.mogujie.tt.log.Logger; import com.mogujie.tt.ui.activity.PickPhotoActivity; /** * @Description 相册图片缓存 * @author Nana * @date 2014-5-9 */ public class BitmapCache extends Activity { public Handler handler = new Handler(); public final String TAG = getClass().getSimpleName(); private static HashMap<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>(); int threadCount = Runtime.getRuntime().availableProcessors(); ExecutorService executorService = Executors .newFixedThreadPool(threadCount + 1); private static BitmapCache instance = null; private Logger logger = Logger.getLogger(BitmapCache.class); public static synchronized BitmapCache getInstance() { if (null == instance) { instance = new BitmapCache(); } return instance; } private BitmapCache() { } private void put(String path, Bitmap bmp) { if (!TextUtils.isEmpty(path) && null != bmp) { imageCache.put(path, new SoftReference<Bitmap>(bmp)); } } public Bitmap getCacheBitmap(String thumbPath, String sourcePath) { try { if (TextUtils.isEmpty(thumbPath) && TextUtils.isEmpty(sourcePath)) { return null; } final String path; if (!TextUtils.isEmpty(thumbPath)) { path = thumbPath; } else if (!TextUtils.isEmpty(sourcePath)) { path = sourcePath; } else { return null; } if (imageCache.containsKey(path)) { SoftReference<Bitmap> reference = imageCache.get(path); Bitmap bmp = reference.get(); return bmp; } return null; } catch (Exception e) { logger.e(e.getMessage()); return null; } } public void displayBmp(final ImageView iv, final String thumbPath, final String sourcePath, final ImageCallback callback) { try { if (TextUtils.isEmpty(thumbPath) && TextUtils.isEmpty(sourcePath)) { return; } final String path; final boolean isThumbPath; if (!TextUtils.isEmpty(thumbPath)) { path = thumbPath; isThumbPath = true; } else if (!TextUtils.isEmpty(sourcePath)) { path = sourcePath; isThumbPath = false; } else { return; } iv.setImageBitmap(null); Runnable calculateBitmapWorker = new Runnable() { @Override public void run() { Bitmap thumb = null; try { if (isThumbPath) { thumb = BitmapFactory.decodeFile(thumbPath); if (null == thumb) { thumb = revitionImageSize(sourcePath); } } else { thumb = revitionImageSize(sourcePath); } } catch (Exception e) { } if (null == thumb) { thumb = PickPhotoActivity.bimap; } put(path, thumb); final Bitmap bmpToCallback = thumb; if (null != callback) { handler.post(new Runnable() { @Override public void run() { callback.imageLoad(iv, bmpToCallback, sourcePath); } }); } } }; executorService.execute(calculateBitmapWorker); } catch (Exception e) { logger.e(e.getMessage()); } } public Bitmap revitionImageSize(String path) throws IOException { BufferedInputStream in = null; try { in = new BufferedInputStream(new FileInputStream(new File(path))); BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeStream(in, null, options); in.close(); in = null; int i = 0; Bitmap bitmap = null; while (true) { if ((options.outWidth >> i <= 256) && (options.outHeight >> i <= 256)) { in = new BufferedInputStream(new FileInputStream(new File( path))); options.inSampleSize = (int) Math.pow(2.0D, i); options.inJustDecodeBounds = false; bitmap = BitmapFactory.decodeStream(in, null, options); break; } i += 1; } return bitmap; } catch (Exception e) { logger.e(e.getMessage()); return null; } finally { if (null != in) { in.close(); in = null; } } } public interface ImageCallback { public void imageLoad(ImageView imageView, Bitmap bitmap, Object... params); } }