From 190acd4dd0ffdadccd3857740e7831143ac2a496 Mon Sep 17 00:00:00 2001 From: Mathias Jeppsson Date: Tue, 18 Jan 2011 14:34:52 +0100 Subject: [PATCH] Fixing memory leak in PreferenceScreen. Every time the PreferenceScreen is displayed a new ListView is created and bound to the adapter. As the same adapter is used during the lifetime of PreferenceScreen and the listviews never gets unbound, the adapter will contain a list of unused views. The old view should be unbound from adapter when we create a new view. Change-Id: I13e2d0dc79c8ff79b58efa650653e3f84c6e53c5 --- core/java/android/preference/PreferenceScreen.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/core/java/android/preference/PreferenceScreen.java b/core/java/android/preference/PreferenceScreen.java index 95e54324f4458..fae5f1ae17bbc 100644 --- a/core/java/android/preference/PreferenceScreen.java +++ b/core/java/android/preference/PreferenceScreen.java @@ -80,6 +80,8 @@ public final class PreferenceScreen extends PreferenceGroup implements AdapterVi private ListAdapter mRootAdapter; private Dialog mDialog; + + private ListView mListView; /** * Do NOT use this constructor, use {@link PreferenceManager#createPreferenceScreen(Context)}. @@ -145,15 +147,18 @@ public final class PreferenceScreen extends PreferenceGroup implements AdapterVi private void showDialog(Bundle state) { Context context = getContext(); - ListView listView = new ListView(context); - bind(listView); + if (mListView != null) { + mListView.setAdapter(null); + } + mListView = new ListView(context); + bind(mListView); // Set the title bar if title is available, else no title bar final CharSequence title = getTitle(); Dialog dialog = mDialog = new Dialog(context, TextUtils.isEmpty(title) ? com.android.internal.R.style.Theme_NoTitleBar : com.android.internal.R.style.Theme); - dialog.setContentView(listView); + dialog.setContentView(mListView); if (!TextUtils.isEmpty(title)) { dialog.setTitle(title); }