Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 82afc7b3 authored by Romain Guy's avatar Romain Guy
Browse files

Prevent possible leak in AbsListViews.

This change unregisters a list's data observer from the adapter when the list
is detached from the window. The default data observer impl. is a non-static
inner class with a synthesized pointer to the list. Thus if an app keeps
the adapter around the list is also kept around. This can be a problem with
dialogs in particular.

Change-Id: Ia95a995d3f54b9caf1bbcd2c7239a0318511b08c
parent d4a2fffe
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -1585,6 +1585,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
                treeObserver.addOnGlobalLayoutListener(this);
            }
        }
        
        if (mAdapter != null && mDataSetObserver == null) {
            mDataSetObserver = new AdapterDataSetObserver();
            mAdapter.registerDataSetObserver(mDataSetObserver);
        }
    }

    @Override
@@ -1605,6 +1610,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
                mGlobalLayoutListenerAddedFilter = false;
            }
        }

        if (mAdapter != null) {
            mAdapter.unregisterDataSetObserver(mDataSetObserver);
            mDataSetObserver = null;
        }
    }

    @Override
+1 −1
Original line number Diff line number Diff line
@@ -415,7 +415,7 @@ public class ListView extends AbsListView {
     */
    @Override
    public void setAdapter(ListAdapter adapter) {
        if (null != mAdapter) {
        if (mAdapter != null) {
            mAdapter.unregisterDataSetObserver(mDataSetObserver);
        }