删除WeakReference时的回调

时间:2014-03-01 12:34:43

标签: java android weak-references

删除WeakReference时是否有提醒的方法?我需要向实例添加Android上下文,我将其添加为WeakReference,然后我想处理一些事情/如果删除它?我想我在某个地方读到了这个,但是因为我记不清楚在哪里找它没有给我什么:(

2 个答案:

答案 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()方法返回引用,但是可以将其强制转换为条目。