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

时间:2015-02-14 08:17:41

标签: java android observer-pattern baseadapter

我有MyAdapter extends BaseAdapter JniSource 中提取信息。 MyAdapter implements JniSource.Observer并在基础 JNI 数据发生变化时获得回调。

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

MyAdapter.finalize()不能成为这个地方,因为 JniSource 仍然在LinkedList}内引用MyAdapter。 如果我不打电话JniSource.unregisterObserver(),这会导致泄密。

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

2 个答案:

答案 0 :(得分:0)

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

(来自维基百科)

  

dispose模式是一种设计模式,用于处理资源清理并防止使用自动垃圾收集的运行时环境中的资源泄漏。


  1. 创建界面Disposable

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

  4. 修改
    在android的情况下,生命周期方法是代码的最佳位置。在这种情况下,onDestroy方法似乎是最佳候选者。在其他平台中,程序员必须以某种方式管理生命周期(主要是手动)。这应该在那时考虑。

答案 1 :(得分:0)

这个想法很简单,当MyAdapter有观察者时,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();
    }
};