package com.example.fei.yhb_20.utils;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import android.widget.ImageView;
import com.example.fei.yhb_20.ui.MerchantRegist;
import com.example.fei.yhb_20.ui.PostActivity;
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;
public class BitmapCache extends Activity {
public Handler h = new Handler();
public final String TAG = getClass().getSimpleName();
private HashMap<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>();
public void put(String path, Bitmap bmp) {
if (!TextUtils.isEmpty(path) && bmp != null) {
imageCache.put(path, new SoftReference<Bitmap>(bmp));
}
}
public void displayBmp(final ImageView iv, final String thumbPath,
final String sourcePath, final ImageCallback callback) {
if (TextUtils.isEmpty(thumbPath) && TextUtils.isEmpty(sourcePath)) {
Log.e(TAG, "no paths pass in");
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 {
// iv.setImageBitmap(null);
return;
}
if (imageCache.containsKey(path)) {
SoftReference<Bitmap> reference = imageCache.get(path);
Bitmap bmp = reference.get();
if (bmp != null) {
if (callback != null) {
callback.imageLoad(iv, bmp, sourcePath);
}
iv.setImageBitmap(bmp);
Log.d(TAG, "hit cache");
return;
}
}
iv.setImageBitmap(null);
new Thread() {
Bitmap thumb;
public void run() {
try {
if (isThumbPath) {
thumb = BitmapFactory.decodeFile(thumbPath);
if (thumb == null) {
thumb = revitionImageSize(sourcePath);
}
} else {
thumb = revitionImageSize(sourcePath);
}
} catch (Exception e) {
}
if (thumb == null) {
if (GV.getMyClass()==MerchantRegist.class){
thumb = MerchantRegist.bimap;
}else if (GV.getMyClass()== PostActivity.class){
thumb = PostActivity.bimap;
}
}
Log.e(TAG, "-------thumb------"+thumb);
put(path, thumb);
if (callback != null) {
h.post(new Runnable() {
@Override
public void run() {
callback.imageLoad(iv, thumb, sourcePath);
}
});
}
}
}.start();
}
public Bitmap revitionImageSize(String path) throws IOException {
BufferedInputStream in = new BufferedInputStream(new FileInputStream(
new File(path)));
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(in, null, options);
in.close();
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;
}
public interface ImageCallback {
public void imageLoad(ImageView imageView, Bitmap bitmap,
Object... params);
}
}