私はOutOfMemoryError
自分のアプリケーションを取得しています。いくつかのチュートリアルを行ったとき、 を使用してこの問題を解決できることがわかりましたSoftreference/Weakreference
。しかし、私はそれを使用する方法がわかりませんSoftreference/Weakreference
。
Softreference または Weakreference の例を提供するチュートリアルをいくつか提案してください。
ありがとうございました...
私はOutOfMemoryError
自分のアプリケーションを取得しています。いくつかのチュートリアルを行ったとき、 を使用してこの問題を解決できることがわかりましたSoftreference/Weakreference
。しかし、私はそれを使用する方法がわかりませんSoftreference/Weakreference
。
Softreference または Weakreference の例を提供するチュートリアルをいくつか提案してください。
ありがとうございました...
package com.myapp;
import java.io.File;
import java.lang.ref.SoftReference;
import java.util.WeakHashMap;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
public class BitmapSoftRefrences {
public static String SDPATH = Environment.getExternalStorageDirectory()
+ "/MYAPP";
// 1. create a cache map
public static WeakHashMap<String, SoftReference<Bitmap>> mCache = new WeakHashMap<String, SoftReference<Bitmap>>();
public static String TAG = "BitmapSoftRefrences";
// 2. ask for bitmap
public static Bitmap get(String key) {
if (key == null) {
return null;
}
try {
if (mCache.containsKey(key)) {
SoftReference<Bitmap> reference = mCache.get(key);
Bitmap bitmap = reference.get();
if (bitmap != null) {
return bitmap;
}
return decodeFile(key);
}
} catch (Exception e) {
// TODO: handle exception
Logger.debug(BitmapSoftRefrences.class,
"EXCEPTION: " + e.getMessage());
}
// the key does not exists so it could be that the
// file is not downloaded or decoded yet...
File file = new File(SDPATH + "/" + key);
if (file.exists()) {
return decodeFile(key);
} else {
Logger.debug(BitmapSoftRefrences.class, "RuntimeException");
throw new RuntimeException("RuntimeException!");
}
}
// 3. the decode file will return bitmap if bitmap is not cached
public static Bitmap decodeFile(String key) {
// --- prevent scaling
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inScaled = false;
Bitmap bitmap = BitmapFactory.decodeFile(SDPATH + "/" + key, opt);
mCache.put(key, new SoftReference<Bitmap>(bitmap));
return bitmap;
}
public static void clear() {
mCache.clear();
}
}
次のチュートリアルを参照してください
を作成するためWeakReference
の構文はWeakReference<SomeType> myWeakReference = new WeakReference<SomeType>(actualObject);
です。それを介してオブジェクトを取得するWeakReference
には、チェックを実行しif (weakWidget == null)
ます。NullPointerException
そうすれば、すでにガベージコレクションされている場合は回避できます。
Ethan NicholasによるこのJava.netの記事では、強力なものの代わりに使用する理由を説明しています。WeakReference
これは、開発者が各インスタンスを追跡するためにシリアルUIDを定義することを決定したことを前提として、シリアルUIDが定義されていないというfinal
(拡張不可能な)クラスの例を示しています。彼らは新しいものを作成し、強い参照であるようなことをすることによってそうします。つまり、不要になったときに明示的にクリーンアップする必要があります。開発者は、その参照を手動で「ガベージコレクション」してから削除するタイミングを正確に知る責任があります。これは、実際に参照されている場合にのみ実行する必要があります。Widget
Widget
HashMap
serialNumberMap.put(widget, widgetSerialNumber);
HashMap
もう必要ないことを確認してください。これは、アプリケーションで発生した問題である可能性があります。
この特定のケースでは、記事で説明されているように、開発者はWeakHashMap
代わりにクラスを使用できます(@NayAneshGupteが彼の例で示したように)。ここで、キーは実際にはWeakReference
です。これにより、JVMWidget
は適切と思われる古いキーのキーを無効にすることができるため、ガベージコレクターがやって来て、関連するオブジェクトを破棄する可能性があります。
SoftReferences
この記事では、とについても説明してPhantomReferences
います(これは私が使用したことはありません)。これらすべての詳細については、このjavapapers.comの記事とこのRallyブログをご覧ください。