我正在OutOfMemoryError
申请我的申请。当我浏览了一些教程时,我才知道,我可以通过使用Softreference/Weakreference
. 但我不知道如何使用Softreference/Weakreference
.
请向我推荐一些提供软引用或弱引用示例的教程。
谢谢...
我正在OutOfMemoryError
申请我的申请。当我浏览了一些教程时,我才知道,我可以通过使用Softreference/Weakreference
. 但我不知道如何使用Softreference/Weakreference
.
请向我推荐一些提供软引用或弱引用示例的教程。
谢谢...
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();
}
}
请参阅以下教程
要创建一个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 的键,以便垃圾收集器可以出现并销毁它们的关联对象。
这篇文章还继续谈论SoftReferences
和PhantomReferences
(我从未使用过)。您可以在此 javapapers.com 文章和此 Rally 博客中阅读有关所有这些的更多信息。