如何取消注册依赖于其他来源的 BaseAdapter
how to unregister BaseAdapter that depends on other source
我有一个 MyAdapter extends BaseAdapter
从 JniSource 中提取信息。 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.
创建界面Disposable
public interface Disposable {
public void dispose();
}
- 在
MyAdapter
class中实现,在实现的dispose
方法中调用JniSource.unregisterObserver(MyAdapter)
方法
- 使用完
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();
}
};
我有一个 MyAdapter extends BaseAdapter
从 JniSource 中提取信息。 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.
创建界面
Disposable
public interface Disposable { public void dispose(); }
- 在
MyAdapter
class中实现,在实现的dispose
方法中调用JniSource.unregisterObserver(MyAdapter)
方法 - 使用完
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();
}
};