牛骨文教育服务平台(让学习变的简单)

虽然遇到过几次因为BITMAP照成OOM,但是之前都没有正视过这个问题,今天去面试果然出现了这个问题,感觉被虐了啊。知耻而后勇,回去查了一些资料,现在总算明白了一点LruCache图片缓存技术,这个类非常适合用来缓存图片,它的主要算法原理是把最近使用的对象用强引用存储在 LinkedHashMap 中,并且把最近最少使用的对象在缓存值达到预设定值之前从内存中移除,这种机制非常适合bitmap这种内存坑爹货啊。

下面贴一下示例代码,其实这个代码一点实用意义都没有,只不过把里面的一些函数和调用提了一下。

package com.example.mytest;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v4.util.LruCache;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;

public class MainActivity extends Activity {
	private ImageView iv;
	private Bitmap bm;
	private LruCache<String, Bitmap> mMemoryCache;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
		final int cacheSize = maxMemory/8;
		
		mMemoryCache = new LruCache<String, Bitmap>((cacheSize)){
			@Override
			protected int sizeOf(String key, Bitmap value) {
				// TODO Auto-generated method stub
				return value.getByteCount()/1024;
			}
		};
		
		iv = (ImageView) findViewById(R.id.iv);
		bm = BitmapFactory.decodeResource(getResources(), R.drawable.xiamu);
		iv.setImageBitmap(bm);
		
		mMemoryCache.put("key", bm);
		
		iv.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Bitmap bitmap = null;
				// TODO Auto-generated method stub
				if (mMemoryCache.get("key") == null) {
					bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.xiamu);
					iv.setImageBitmap(bitmap);
				}
				else {
					iv.setImageBitmap(mMemoryCache.get("key"));
				}
			}			
		});
	}
	
}