Android: пример SoftReference / WeakReference - PullRequest
2 голосов
/ 30 июня 2011

Я получаю OutOfMemoryError по моему заявлению.Когда я прошел некоторые уроки, я понял, что могу решить эту проблему, используя Softreference/Weakreference.Но я не знаю, как использовать Softreference/Weakreference.

. Пожалуйста, предложите мне несколько руководств, в которых приведены примеры для Softreference или Weakreference.

Спасибо ...

Ответы [ 3 ]

3 голосов
/ 16 марта 2012
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();
}

}
1 голос
/ 30 июня 2011

См. Следующий учебник

Как использовать SoftReference

0 голосов
/ 18 января 2012

Чтобы создать WeakReference, используйте синтаксис WeakReference<SomeType> myWeakReference = new WeakReference<SomeType>(actualObject);. Чтобы получить объект через этот WeakReference, выполните проверку if (weakWidget == null). Таким образом, вы избежите NullPointerException, если он уже был собран мусором.

Эта статья на Java.net Этана Николаса объясняет , почему вы хотели бы использовать WeakReference вместо сильного. В нем приведен пример класса final (непостижимый) с именем Widget, у которого нет определенного последовательного UID, при условии, что разработчик решит определить последовательный UID для отслеживания каждого экземпляра Widget. Они делают это, создавая новый HashMap и делая что-то вроде serialNumberMap.put(widget, widgetSerialNumber);, что является сильной ссылкой. Это означает, что он должен быть явно очищен, когда он больше не нужен. Разработчик несет ответственность за то, чтобы точно знать, когда вручную «собирать мусор» этой ссылки и удалять ее из HashMap, что следует делать только тогда, когда они действительно уверены, что она больше не нужна. Это может быть проблема, с которой вы столкнулись в вашем приложении.

В этом конкретном случае, как объясняется в статье, разработчик мог бы использовать класс WeakHashMap вместо этого (как в своем примере @NayAneshGupte), где ключ на самом деле WeakReference. Это позволило бы JVM аннулировать ключи к старым Widget s так, как считает нужным, чтобы сборщик мусора мог прийти и уничтожить связанные с ними объекты.

В статье также говорится о SoftReferences и PhantomReferences (которые я никогда не использовал). Вы можете прочитать больше обо всем этом в этой статье javapapers.com и в этом блоге Rally .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...