删除 WeakReference 时的回调

Dan*_*l B 5 java android weak-references

当 WeakReference 被删除时,有没有办法收到警报?我需要向实例添加一个 Android 上下文,我将它添加为 WeakReference,然后我想在/如果删除它时处理一些事情?我想我在某处读到过这个,但因为我不记得在哪里搜索它给我什么:(

Nam*_*ace 2

弱引用(wr)不提供回调。如果需要正确的回调,可以重写对象的 Finalize 方法,以便在垃圾收集 (gc'd) 时执行某些操作。

wr 提供的是一个引用队列(rq),它基本上是一个引用对象尚未被垃圾回收的引用列表。您可以在引用的构造函数中附加一个引用队列。

    ReferenceQueue<Drawable> rq = new ReferenceQueue<Drawable>();
    WeakReference<Drawable> wr = new WeakReference<Drawable>(dr, rq);
Run Code Online (Sandbox Code Playgroud)

一旦我们的drawable被GC,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);
Run Code Online (Sandbox Code Playgroud)

我们可能将 wr 放入映射中,因为当我们从 rq 获取“wr”时,我们没有任何方法可以知道它是什么 - 毕竟它的引用为空。它唯一的意义在于它所指的内容,而它已经不存在了,所以我们需要这种意义的记录,所以我们把它放在地图中,以我们想要采取的一些行动为关键,这甚至可能只是从地图中删除弱引用本身。