Fix bug #16957601 Stability: ISE in Settings: Observer com.android.settings.
SettingsPreferenceFragment$1@273c8fdb was not registered
- add override for onUnbindPreferences() that will unregister the observer
if needed
- keep track of the root adapter so that we can unregister / register with
the correct one (by having a new PreferenceScreen the root adapter would not
be the same and thus unregistering the Observer on the new one would not work
and create the current bug)
Change-Id: I2cef0398c2ae0ab4f5ffd67ca20e8874be997bf6
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index f89b72e..83b3a68 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -66,7 +66,7 @@
private boolean mPreferenceHighlighted = false;
private Drawable mHighlightDrawable;
- private Object mRegisterLock = new Object();
+ private ListAdapter mCurrentRootAdapter;
private boolean mIsDataSetObserverRegistered = false;
private DataSetObserver mDataSetObserver = new DataSetObserver() {
@Override
@@ -147,6 +147,11 @@
}
@Override
+ protected void onUnbindPreferences() {
+ unregisterObserverIfNeeded();
+ }
+
+ @Override
public void onStop() {
super.onStop();
@@ -154,20 +159,23 @@
}
public void registerObserverIfNeeded() {
- synchronized (mRegisterLock) {
- if (!mIsDataSetObserverRegistered) {
- getPreferenceScreen().getRootAdapter().registerDataSetObserver(mDataSetObserver);
- mIsDataSetObserverRegistered = true;
+ if (!mIsDataSetObserverRegistered) {
+ if (mCurrentRootAdapter != null) {
+ mCurrentRootAdapter.unregisterDataSetObserver(mDataSetObserver);
}
+ mCurrentRootAdapter = getPreferenceScreen().getRootAdapter();
+ mCurrentRootAdapter.registerDataSetObserver(mDataSetObserver);
+ mIsDataSetObserverRegistered = true;
}
}
public void unregisterObserverIfNeeded() {
- synchronized (mRegisterLock) {
- if (mIsDataSetObserverRegistered) {
- getPreferenceScreen().getRootAdapter().unregisterDataSetObserver(mDataSetObserver);
- mIsDataSetObserverRegistered = false;
+ if (mIsDataSetObserverRegistered) {
+ if (mCurrentRootAdapter != null) {
+ mCurrentRootAdapter.unregisterDataSetObserver(mDataSetObserver);
+ mCurrentRootAdapter = null;
}
+ mIsDataSetObserverRegistered = false;
}
}