2

我正在OutOfMemoryError申请我的申请。当我浏览了一些教程时,我才知道,我可以通过使用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 文章解释了为什么要使用 aWeakReference而不是 strong 。它提供了一个没有定义串行 UID 的final(不可扩展的)类的示例Widget,假设开发人员决定定义一个串行 UID 来跟踪每个Widget实例。他们通过创建一个新的HashMap并做类似的事情来做到这一点serialNumberMap.put(widget, widgetSerialNumber);,这是一个强有力的参考。这意味着它必须在不再需要时显式清理。开发人员有责任准确地知道何时手动“垃圾收集”该引用并将其从HashMap.确定它不再需要了。这可能是您在应用程序中遇到的问题。

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

这篇文章还继续谈论SoftReferencesPhantomReferences(我从未使用过)。您可以在此 javapapers.com 文章此 Rally 博客中阅读有关所有这些的更多信息。

于 2012-01-17T20:34:59.330 回答