删除WeakReference时是否有提醒的方法?我需要向实例添加Android上下文,我将其添加为WeakReference,然后我想处理一些事情/如果删除它?我想我在某个地方读到了这个,但是因为我记不清楚在哪里找它没有给我什么:(
答案 0 :(得分:2)
弱参考(wr)不提供回叫。如果你需要一个正确的回调,可以覆盖对象的finalize方法,以便在垃圾收集时执行某些操作(gc'd)。
wr提供的是一个referenceQueue(rq),它基本上是一个参考列表,其参照物没有被gc'd。在引用的构造函数中附加referenceQueue。
ReferenceQueue<Drawable> rq = new ReferenceQueue<Drawable>();
WeakReference<Drawable> wr = new WeakReference<Drawable>(dr, rq);
一旦我们的drawable是gc'd,referenceQueue应该包含wr。
do{
Reference<?> ref = rq.poll(); //this should be your weak reference
if(ref == null) break;
ref.get(); //Should always be null, cause referent is gc'd
// do something
}while(true);
我们可能把wr放在地图中,因为当我们从rq中取回它时,我们没有任何方法可以告诉“wr”是什么 - 在它的所有引用为空之后。它唯一的意义在于它所提到的,而且不再存在,所以我们需要记录这个意义,所以我们把它放在地图中,键入我们想采取的一些行动,甚至可能只是从地图中删除弱引用本身。
答案 1 :(得分:0)
执行此操作的首选方法是使用ReferenceQueue<T>
,如@NameSpace所示。但是,常见的模式是扩展WeakReference<T>
,以便您可以继续在其中标识信息。 (很明显,这应该不是是垃圾收集对象或对其进行引用的对象。)
例如,WeakHashMap<K,V>
清除类型为K
的垃圾收集键。每个扩展Entry
的 entry 都有一个WeakReference<Object>
类。 Entry
的构造函数将其添加到WeakHashMap
的参考队列中。条目的密钥K作为实际的弱引用存储在超类中。值V存储在子类中。然后,将删除此队列上的所有条目。
进一步了解java.util.WeakHashMap
。
在每次认沽时,都会检查参考队列。 poll()
方法返回引用,但是可以将其强制转换为条目。