android:SoftReference / WeakReference示例

时间:2011-06-30 09:54:29

标签: android weak-references soft-references

我的应用程序正在OutOfMemoryError。当我阅读一些教程时,我开始知道,我可以使用Softreference/Weakreference来解决这个问题。但我不知道如何使用Softreference/Weakreference

请为我推荐一些提供软参考或弱参考示例的教程。

谢谢...

3 个答案:

答案 0 :(得分: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();
}

}

答案 1 :(得分:1)

请参阅以下教程

How to use SoftReference

答案 2 :(得分:0)

要创建WeakReference,语法为WeakReference<SomeType> myWeakReference = new WeakReference<SomeType>(actualObject);。要通过WeakReference检索对象,请检查if (weakWidget == null)。这样,如果已经垃圾收集,您将避免使用NullPointerException

This Java.net article by Ethan Nicholas解释为什么您希望使用WeakReference而不是强大的final。它提供了一个名为Widget的{​​{1}}(不可扩展)类的示例,它没有定义的串行UID,假设开发人员决定定义一个串行UID来跟踪每个Widget实例。他们通过创建新的HashMap并执行类似serialNumberMap.put(widget, widgetSerialNumber);的操作来实现这一点,这是一个强大的参考。这意味着必须在不再需要时明确清理它。开发人员负责确切地知道何时手动“垃圾收集”该引用并将其从HashMap中删除,这应该仅在他们确实确定不再需要时才会执行。这可能是您在应用程序中遇到的问题。

在这种特殊情况下,正如文章所解释的那样,开发人员可以使用WeakHashMap类(在他的示例中使用@NayAneshGupte),其中密钥实际上是WeakReference。这将允许JVM在其认为合适的情况下使密钥无效到旧的Widget,以便垃圾收集器可以出现并销毁它们的关联对象。

本文还继续讨论SoftReferencesPhantomReferences(我从未使用过)。您可以在this javapapers.com articlethis Rally blog中详细了解所有这些内容。