メモリオーバーフローの解決策
2762 ワード
最近ニュースクライアントをしているときにListViewの大図をロードするとメモリオーバーフローの問題が発生します.メモリオーバーフロー(OOM).理解しやすいように、例えてみましょう.バッファオーバーフローは、10ポンドの砂糖を5ポンドしか入れられない容器に入れるようなものです.この容器がいっぱいになると、残りの部分がカウンターや床にあふれ、めちゃくちゃになります.コンピュータプログラムの作成者がいくつかのコードを書いたため、これらのコードは目的の領域やバッファ--5ポンドの容器--に対して適切な検査をしていません.それらが十分に大きいかどうか、新しい内容--10ポンドの砂糖を完全に入れることができるかどうかを見て、結果としてバッファオーバーフローの発生をもたらす可能性があります.新しい場所に入れようとするデータが合わず、あふれていると、そのデータも面倒になります.しかし、バッファがオーバーフローするだけであれば、これは問題にすぎません.これまで破壊的ではありませんでした砂糖があふれ出ると、カウンターが覆われます.砂糖を拭いたり掃除機で吸い取ったりして、カウンターの本来の姿を返すことができます.これに対して,バッファがオーバーフローすると,過剰な情報がコンピュータメモリ内の以前のコンテンツを上書きする.これらの上書きされたコンテンツが保存されたり、復元されたりしない限り、永遠に失われます.
まず思いついたのは3級キャッシュで,サーバからダウンロードした画像はネットワークキャッシュを通過するが,この方法は優先的にロードされず,速度が遅く,トラフィックを浪費する.次にローカルキャッシュ、セカンダリ優先ロード、速度が速い.最後に一番いいのはメモリキャッシュで、優先的にロードして、速度が一番速いです.Androidのデフォルトではappごとに16 Mのメモリしか割り当てられていないことはよく知られているので、ソフトリファレンスでSoftReferenceでメモリが足りない場合、ゴミ回収器は回収を検討します.ただし、Android 2.3+では、メモリが十分であっても、SoftReferenceのオブジェクトを事前に回収することが優先されます.だからグーグル政府はLruCacheを使うことを提案した.least recenlly useの最も最近の使用アルゴリズム
メモリは一定のサイズに制御され、最大値を超えると自動的に回収されます.この最大値は開発者が自分で決めます.実はLruCacheは多くのHashMap、300行以上のコードを使っています.
もちろん、BitmapUtilsを使えばいいです.
まず思いついたのは3級キャッシュで,サーバからダウンロードした画像はネットワークキャッシュを通過するが,この方法は優先的にロードされず,速度が遅く,トラフィックを浪費する.次にローカルキャッシュ、セカンダリ優先ロード、速度が速い.最後に一番いいのはメモリキャッシュで、優先的にロードして、速度が一番速いです.Androidのデフォルトではappごとに16 Mのメモリしか割り当てられていないことはよく知られているので、ソフトリファレンスでSoftReferenceでメモリが足りない場合、ゴミ回収器は回収を検討します.ただし、Android 2.3+では、メモリが十分であっても、SoftReferenceのオブジェクトを事前に回収することが優先されます.だからグーグル政府はLruCacheを使うことを提案した.least recenlly useの最も最近の使用アルゴリズム
メモリは一定のサイズに制御され、最大値を超えると自動的に回収されます.この最大値は開発者が自分で決めます.実はLruCacheは多くのHashMap、300行以上のコードを使っています.
/**
*
*/
public class MemoryCacheUtils {
// private HashMap<String, SoftReference<Bitmap>> mMemoryCache = new
// HashMap<String, SoftReference<Bitmap>>();
private LruCache<String, Bitmap> mMemoryCache;
public MemoryCacheUtils() {
long maxMemory = Runtime.getRuntime().maxMemory() / 8;// 16M
mMemoryCache = new LruCache<String, Bitmap>((int) maxMemory) {
@Override
protected int sizeOf(String key, Bitmap value) {
int byteCount = value.getRowBytes() * value.getHeight();//
return byteCount;
}
};
}
/**
*
*
* @param url
*/
public Bitmap getBitmapFromMemory(String url) {
// SoftReference<Bitmap> softReference = mMemoryCache.get(url);
// if (softReference != null) {
// Bitmap bitmap = softReference.get();
// return bitmap;
// }
return mMemoryCache.get(url);
}
/**
*
*
* @param url
* @param bitmap
*/
public void setBitmapToMemory(String url, Bitmap bitmap) {
// SoftReference<Bitmap> softReference = new
// SoftReference<Bitmap>(bitmap);
// mMemoryCache.put(url, softReference);
mMemoryCache.put(url, bitmap);
}
}
java
- , java
- SoftReference ,
- WeakReference ,
- PhantomReference ,
</pre><pre name="code" class="java"> , :
//
BitmapFactory.Options option = new BitmapFactory.Options();
option.inSampleSize = 2;// ,
option.inPreferredConfig = Bitmap.Config.RGB_565;//
もちろん、BitmapUtilsを使えばいいです.