I have a MyAdapter extends BaseAdapter
that extract information from JniSource. MyAdapter implements JniSource.Observer
and get a callback when underlying JNI data is changed.
My Question: I can JniSource.registerObserver(MyAdapter)
in constructor but where to call JniSource.unregisterObserver(MyAdapter)
.
MyAdapter.finalize()
cannot be the place because JniSource is still having reference (inside LinkedList
) to MyAdapter
.
If I don't call JniSource.unregisterObserver()
this would cause a leak.
Extra Note: all JniSource methods are static.
The idea is simple, when MyAdapter have observer, then MyAdapter register itself to the JniSource. using this way i do not have to mantain anything absolute. (life cycle is relative).
Added benifit: This also prevent from unwanted changed callback from JniSource since there are no observer for 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();
}
};