我的应用程序正在OutOfMemoryError
。当我阅读一些教程时,我开始知道,我可以使用Softreference/Weakreference
来解决这个问题。但我不知道如何使用Softreference/Weakreference
。
请为我推荐一些提供软参考或弱参考示例的教程。
谢谢...
答案 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)
请参阅以下教程
答案 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
,以便垃圾收集器可以出现并销毁它们的关联对象。
本文还继续讨论SoftReferences
和PhantomReferences
(我从未使用过)。您可以在this javapapers.com article和this Rally blog中详细了解所有这些内容。