android Caching Bit地图s学习

android Caching Bitmaps学习

参考链接:

Displaying Bitmaps Efficiently

Caching Bitmaps 翻译

先吐槽一下:google 给示例中都有错误的地方,国内翻译的也不去掉错误.太坑.

谷歌官方Download the sample

 也可参照guolin的文章, 


经过一番学习,初步实践完成.贴出来,备用.

package com.akm.testlrucache;


import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.v4.util.LruCache;
import android.util.DisplayMetrics;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;

public class BitmapCacheUtil {
	private Context context;
	private int screenWidth = 0; 
	private int screenHeight = 0;
	private final int TITLE_HEIGHT = 48;
	private ImageView imageView;
	private int resid;
	private LruCache<String, Bitmap> mMemoryCache;  
	private BitmapWorkerTask  task ;  
	public BitmapCacheUtil(Context context , ImageView imageView,int resid) {
		this.context = context;
		this.imageView = imageView;
		this.resid =resid; 

		int maxMemory = (int) Runtime.getRuntime().maxMemory();  
		int cacheSize = maxMemory / 8;  
		mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {  
			@Override  
			protected int sizeOf(String key, Bitmap bitmap) {  
				return bitmap.getByteCount();  
			}  
		};  
		loadBitmap();

	}

	public void loadBitmap() {   

		Bitmap bitmap = getBitmapFromMemoryCache(String.valueOf(resid));
		if (bitmap==null) {
			// mImageView.setImageResource(R.drawable.image_placeholder);
			task = new BitmapWorkerTask();  
			task.execute(resid); 
		}else{
			imageView.setImageBitmap(bitmap);  
		} 
	}  

	private Bitmap getBitmapFromMemoryCache(String key) {  
		return mMemoryCache.get(key);  
	}  

	private void addBitmapToMemoryCache(String key, Bitmap bitmap) {  
		if (getBitmapFromMemoryCache(key) == null) {  
			mMemoryCache.put(key, bitmap);  
		}  
	}  

	protected void setImageView() {  
		Bitmap bitmap = getBitmapFromMemoryCache(String.valueOf(resid));  
		if (bitmap != null) {  
			imageView.setImageBitmap(bitmap);  
		} else {  
			imageView.setImageResource(R.drawable.ic_launcher);  
		}  
	}  

	class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {   

		@Override  
		protected Bitmap doInBackground(Integer... params) {  
			final Bitmap bitmap = decodeSampledBitmapFromResource(context.getResources(), params[0], getScreenWidth(context), getScreenHeight(context));
			addBitmapToMemoryCache(String.valueOf(params[0]), bitmap);
			return bitmap;
		}  

		@Override  
		protected void onPostExecute(Bitmap bitmap) {  
			super.onPostExecute(bitmap);  
			if (bitmap != null) {  
				imageView.setImageBitmap(bitmap);   
			}  
		}   

	}  

	public Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
			int reqWidth, int reqHeight) {

		// First decode with inJustDecodeBounds=true to check dimensions
		final BitmapFactory.Options options = new BitmapFactory.Options();
		options.inJustDecodeBounds = true;
		BitmapFactory.decodeResource(res, resId, options);

		// Calculate inSampleSize
		options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

		// Decode bitmap with inSampleSize set
		options.inJustDecodeBounds = false;
		return BitmapFactory.decodeResource(res, resId, options);
	}
	public int calculateInSampleSize(
			BitmapFactory.Options options, int reqWidth, int reqHeight) {
		// Raw height and width of image
		final int height = options.outHeight;
		final int width = options.outWidth;
		int inSampleSize = 1;

		if (height > reqHeight || width > reqWidth) {
			if (width > height) {
				inSampleSize = Math.round((float)height / (float)reqHeight);
			} else {
				inSampleSize = Math.round((float)width / (float)reqWidth);
			}
		}
		return inSampleSize;
	}

	public void cancelTask() {  
		if (task != null) {  
			task.cancel(false);  
		}  
	}  

	@SuppressWarnings("deprecation")
	public int getScreenWidth(Context context) {
		if (screenWidth != 0) {
			return screenWidth;
		}
		WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
		screenWidth = wm.getDefaultDisplay().getWidth();
		return screenWidth;
	}

	@SuppressWarnings("deprecation")
	public int getScreenHeight(Context context) {
		if (screenHeight != 0) {
			return screenHeight;
		}
		int top = 0;
		if (context instanceof Activity) {
			top = ((Activity) context).getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();
			if (top == 0) {
				top = (int) (TITLE_HEIGHT * getScreenDensity(context));
			}
		}
		WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
		screenHeight = wm.getDefaultDisplay().getHeight() - top;
		return screenHeight;
	}
	public float getScreenDensity(Context context) {
		WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
		DisplayMetrics metric = new DisplayMetrics();
		wm.getDefaultDisplay().getMetrics(metric);
		return metric.density;
	}

	public float getScreenDensityDpi(Context context) {
		WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
		DisplayMetrics metric = new DisplayMetrics();
		wm.getDefaultDisplay().getMetrics(metric);
		return metric.densityDpi;
	}

}