Articles of 弱引用

WeakReference#get()何时开始返回null?

我想使用WeakReference s作为(android)位图caching的一部分,以便能够检查何时不再使用位图。 我的caching的最大尺寸比Java堆空间小。 当一个新的位图会溢出caching时,它应该放弃不再需要的位图。 我的问题:什么时候WeakReference的get()方法返回null? 只要没有更强的对象的引用? (并且GC还没有发生) 或者当GC运行并确定它们没有更强的对象的引用? 如果2.是真的比我可能遇到的情况,我的caching可以填补和GC最近没有运行的原因。 然后,即使我在上次GC运行后已经放弃了引用, WeakReference#get()仍然会返回该对象,并且我的caching不会将其清除。

IdentityHashMap和WeakHashMap组合

我需要一个Map实现共享IdentityHashMap和WeakHashMap (引用相等而不是equals()和引用弱关键字)的属性。 你推荐什么实现(它必须在Android上工作)?

SQLiteOpenHelper同步

所以我想出了一些想法,我想知道它是否可以实现。 比方说,我有多个表(数据库模型),每个表都由一些类来表示。我不会用开放的帮助器来使用单例模式,所以我创build了一些简单的类来提供单个数据库实例。我的的想法是,只要所有的表持有对SQLiteDatabase的引用(由开放的帮助器返回),他们都将使用相同的数据库实例,可能不需要同步工作与数据库,因为打开帮助器这样做。最后一个表完成它的工作GC将收集打开帮助(因为最后一个引用将是弱引用) – >调用finalize(),并在此方法中closures数据库,以防止从操作系统的任何警告。 我的问题是:这是否可以工作?它会自动closures数据库,将泄漏或抛出一些exception? 这是我的class级: public class DatabaseHelper { private static WeakReference<SomeCustomOpenHelper> sDBOpenHelper; private void notifyDBCreate(SQLiteDatabase db) { for (DBTable table : mTables) { table.onDBCreate(db); } } private void notifyDBUpgrade(SQLiteDatabase db) { for (DBTable table : mTables) { table.onDBUpgrade(db); } } public SQLiteDatabase getDatabase(boolean readOnly) { SomeCustomOpenHelper dbHelper = sDBOpenHelper.get(); if (dbHelper == null) […]

弱参考值弱散列表?

我正在build立一个Android应用程序,其中每个实体都有一个代表其精灵的位图。 但是,每个实体可以被复制(例如,可能有3个实体asdf副本)。 一种方法是先加载所有的精灵,然后把正确的精灵放在实体的构造函数中。 但是,我想懒散解码位图,以便实体的构造函数将解码位图。 唯一的问题是重复的实体会使用两倍的内存来载入相同的位图(如果实体创build了n次,则重复n次)。 为了解决这个问题,我构build了一个SingularBitmapFactory,它将一个解码的Bitmap存储到一个散列表中,如果再次询问相同的位图,则会简单地返回之前散列的一个,而不是构build一个新的。 但是问题在于,工厂拥有所有位图的副本,因此不会收集垃圾。 将hashmap转换为弱引用值的最好方法是什么? 换句话说,我想要一个结构,如果任何其他对象持有对它的引用,值不会被GC'd,但只要没有其他对象引用它,那么它可以GC'd。

WeakReference与ArrayList?

我知道用WeakReference ,如果我做了一个WeakReference的东西,除非有直接的引用,它将被垃圾收集下一个GC周期。 我的问题是,如果我做一个WeakReference的ArrayList ? 例如: ArrayList<WeakReference<String>> exArrayList; exArrayList = new ArrayList<WeakReference<String>>(); exArrayList.add(new WeakReference<String>("Hello")); 我现在可以用exArrayList.get(0).get()来访问数据。 我的问题变成:这是WeakReference数据,位于exArrayList.get(0)的数据将GC'd与下一个GC周期? (即使我不直接引用它),还是这个特定的参考会继续下去,直到arraylist被清空? (例如: exArrayList.clear(); )。 如果这是重复的,我还没有发现它与我的关键字在谷歌。

Weakreference get()方法有多安全? (Android,asynctask)

我正在制作一个Android移动应用程序。 我有一个WeakReference到AsyncTask中的Activity,以确保它可以被垃圾回收。 当onPostExecute()被调用时,我这样做 Acitivty activity = mWeakRef.get(); 然后我使用activity对象来显示对话框给用户等 我的问题是,当我试图确定要显示哪个对话框以及要做什么时,我的活动对象是否可以为空? 如果GC运行在我的执行线之间,它会变成空吗? 我可以安全地继续使用该对象从第一个get()或者我必须重做get()并检查值是否为null之前,我使用它。 谢谢!

Android:GC不尊重SoftReferences?

它接近Dalvik的垃圾收集器不尊重SoftReferences并尽快删除它们,就像WeakReferences一样。 我还没有100%确定,但尽pipe事实上仍有〜3MB的空闲内存,我在LogCat中看到“GC释放的空白字节”后,我的SoftReference被清除了。 另外,我在这里看到Mark Murphy的评论: 除此之外,至less在1.5的时间内,它不适用于Android。 我不知道如果GC SoftReference错误已被修复。 SoftReferences得到GC'd太快,这个错误。 这是真的吗? SoftReference不被尊重? 如何解决这个问题?

Android中的适配器应该是静态内部类还是非静态内部类

我有一个活动中的ListView,我正在设置一个自定义适配器的ListView。 我的适配器类应该是: private static class MyAdapter extends ArrayAdapter 要么 private class MyAdapter extends ArrayAdapter 我想这应该没有区别,只要适配器是封闭的活动参考,但要确认。

在使用java之前testing一个弱引用

在一个multithreading的Android项目中,我看到这样的代码: final WeakReference<MyClass> myClassObjectWeakRef = new WeakReference<MyClass>(aMyClassObject); …然后在别的地方 if (myClassObjectWeakRef.get() != null) { myClassObjectWeakRef.get().someMethod(); } 我敢肯定,在检查和引用的使用之间有一个可能的竞争条件,如果最后一个对象的强引用在另一个线程中的两个之间释放,但我找不到任何文档或任何/谁可以证实这一点,而不是“你可能是对的”。 我认为唯一正确的方式来testing和使用一个弱引用是这样做的: MyClass myObject = myClassObjectWeakRef.get(); // we now have a strong reference, or null: standard checks apply. if (myObject != null) { myObject.someMethod(); } 我非常有信心,第二种方法是100%安全的,但我不知道是否有一些我不知道的Java /编译器糖/魔法,这将使第一种方法安全。 那么,第一种方法是100%安全还是不行?

Android Asyntask:使用上下文的弱引用来避免设备旋转屏幕

在Apress Pro Android 4中 ,作者曾经说过: 当设备旋转时,当前正在运行的活动的上下文将不再有效。 […]一种方法是对活动使用较弱的参照,而不是硬参考[…] 但作者只是提出这个build议,并没有说明是如何完成的。 以前谁做过这个请给我举个例子。