メモリオーバーフローの解決策

2762 ワード

最近ニュースクライアントをしているときにListViewの大図をロードするとメモリオーバーフローの問題が発生します.メモリオーバーフロー(OOM).理解しやすいように、例えてみましょう.バッファオーバーフローは、10ポンドの砂糖を5ポンドしか入れられない容器に入れるようなものです.この容器がいっぱいになると、残りの部分がカウンターや床にあふれ、めちゃくちゃになります.コンピュータプログラムの作成者がいくつかのコードを書いたため、これらのコードは目的の領域やバッファ--5ポンドの容器--に対して適切な検査をしていません.それらが十分に大きいかどうか、新しい内容--10ポンドの砂糖を完全に入れることができるかどうかを見て、結果としてバッファオーバーフローの発生をもたらす可能性があります.新しい場所に入れようとするデータが合わず、あふれていると、そのデータも面倒になります.しかし、バッファがオーバーフローするだけであれば、これは問題にすぎません.これまで破壊的ではありませんでした砂糖があふれ出ると、カウンターが覆われます.砂糖を拭いたり掃除機で吸い取ったりして、カウンターの本来の姿を返すことができます.これに対して,バッファがオーバーフローすると,過剰な情報がコンピュータメモリ内の以前のコンテンツを上書きする.これらの上書きされたコンテンツが保存されたり、復元されたりしない限り、永遠に失われます.
まず思いついたのは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を使えばいいです.