2

私はOutOfMemoryError自分のアプリケーションを取得しています。いくつかのチュートリアルを行ったとき、 を使用してこの問題を解決できることがわかりましたSoftreference/Weakreference。しかし、私はそれを使用する方法がわかりませんSoftreference/Weakreference

Softreference または Weakreference の例を提供するチュートリアルをいくつか提案してください。

ありがとうございました...

4

3 に答える 3

3
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();
}

}
于 2012-03-16T06:29:55.640 に答える
1

次のチュートリアルを参照してください

ソフトリファレンスの使い方

于 2011-06-30T10:03:35.363 に答える
0

を作成するためWeakReferenceの構文はWeakReference<SomeType> myWeakReference = new WeakReference<SomeType>(actualObject);です。それを介してオブジェクトを取得するWeakReferenceには、チェックを実行しif (weakWidget == null)ます。NullPointerExceptionそうすれば、すでにガベージコレクションされている場合は回避できます。

Ethan NicholasによるこのJava.netの記事では、強力なものの代わりに使用する理由を説明しています。WeakReferenceこれは、開発者が各インスタンスを追跡するためにシリアルUIDを定義することを決定したことを前提として、シリアルUIDが定義されていないというfinal(拡張不可能な)クラスの例を示しています。彼らは新しいものを作成し、強い参照であるようなことをすることによってそうします。つまり、不要になったときに明示的にクリーンアップする必要があります。開発者は、その参照を手動で「ガベージコレクション」してから削除するタイミングを正確に知る責任があります。これは、実際に参照されている場合にのみ実行する必要があります。WidgetWidgetHashMapserialNumberMap.put(widget, widgetSerialNumber);HashMapもう必要ないことを確認してください。これは、アプリケーションで発生した問題である可能性があります。

この特定のケースでは、記事で説明されているように、開発者はWeakHashMap代わりにクラスを使用できます(@NayAneshGupteが彼の例で示したように)。ここで、キーは実際にはWeakReferenceです。これにより、JVMWidgetは適切と思われる古いキーのキーを無効にすることができるため、ガベージコレクターがやって来て、関連するオブジェクトを破棄する可能性があります。

SoftReferencesこの記事では、とについても説明してPhantomReferencesいます(これは私が使用したことはありません)。これらすべての詳細については、このjavapapers.comの記事このRallyブログをご覧ください。

于 2012-01-17T20:34:59.330 に答える