雖然遇到過幾次因為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"));
}
}
});
}
}
~~~
- 前言
- 安卓ListView一個簡單代碼的注釋和探討
- 安卓wifi熱點編程代碼的若干注釋
- 安卓距離傳感器編程
- 簡單的ScrollView
- 簡單的ListView
- 簡單的ArrayAdapter
- AsyncTask的初步學習
- AsyncTask再度學習
- Handler初步學習
- 開啟系統Activity
- 隱式調用Activity
- Activity的生命周期
- startActivityForResult的初步學習
- 多點觸控拉伸圖片
- LruCache圖片緩存技術
- SQLiteOpenHelper數據庫操作
- 短信攔截器
- 簡單的Notification
- ListView優化以及checkbox狀態問題
- 安卓多線程下載
- 安卓JSON解析初步探討
- 選項卡樣式的fragment
- DrawerLayout實現簡單的側滑功能
- 安卓軟引用解決圖片OOM問題
- 安卓隱式Intent啟動Activity和BroadcastReceiver若干注意點
- Dialog學習筆記
- ActionBar使用