如何取消注册依赖于其他来源的 BaseAdapter

how to unregister BaseAdapter that depends on other source

我有一个 MyAdapter extends BaseAdapterJniSource 中提取信息。 MyAdapter implements JniSource.Observer 并在基础 JNI 数据更改时获得回调。

我的问题:我可以在构造函数中 JniSource.registerObserver(MyAdapter) 但在哪里调用 JniSource.unregisterObserver(MyAdapter)

MyAdapter.finalize() 不能是这个地方,因为 JniSource 仍然有对 MyAdapter 的引用(在 LinkedList 内)。 如果我不调用 JniSource.unregisterObserver() 这会导致泄漏。

额外注意:所有 JniSource 方法都是静态的。

在这种情况下您需要使用 Dispose Pattern

(来自维基百科)

The dispose pattern is a design pattern which is used to handle resource cleanup and prevent resource leaks in runtime environments that use automatic garbage collection.


  1. 创建界面Disposable

    public interface Disposable {
    
        public void dispose();
    }
    
  2. MyAdapterclass中实现,在实现的dispose方法中调用JniSource.unregisterObserver(MyAdapter)方法
  3. 使用完 MyAdapter 对象后调用 dispose 方法。这必须手动完成,因为垃圾收集器不保证对象是否会被销毁。

编辑:
在 android 的情况下,生命周期方法是您代码的最佳位置。在这种情况下,onDestroy 方法似乎是最佳选择。在其他平台上,程序员必须以某种方式(主要是手动)管理生命周期。那个时候应该考虑一下。

思路很简单,当MyAdapter有observer时,MyAdapter将自己注册到JniSource中。使用这种方式,我不必保留任何绝对的东西。 (生命周期是相对的)。

增加的好处:这也可以防止来自 JniSource 的不必要的更改回调,因为没有 MyAdapter 的观察者

public abstract class MyAdapter extends BaseAdapter implements JniSource.Observer {
    private int observer_count = 0;

    @Override
    public void registerDataSetObserver(DataSetObserver observer) {
        super.registerDataSetObserver(observer);
        if(observer_count == 0) {
            JniSource.registerObserver(this);
        }

        observer_count++;
    }

    @Override
    public void unregisterDataSetObserver(DataSetObserver observer) {
        super.unregisterDataSetObserver(observer);
        //FIXME: what if unregisterDataSetObserver got called for a non-registered observer?
        observer_count--;
        if(observer_count == 0) {
            JniSource.unregisterObserver(this);
        }
    }

    public void onJniSourceDataChanged() {
        notifyDataSetChanged();
    }
};