Search code examples
javaandroidobserver-patternbaseadapter

how to unregister BaseAdapter that depends on other source


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.


Solution

  • 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();
        }
    };