fix intermittent crash in rotate-on-detail-view crash fix

Was sometimes crashing due to trying to remove observer too late
after detecting the newly loaded adapter. (Race condition?)

Change-Id: Ib62d78a2b7d863606070bf6d72ec37b9791bf243
This commit is contained in:
Brion Vibber 2013-10-23 13:45:38 -07:00
parent b3771e16e9
commit 47af8f6b0f
2 changed files with 16 additions and 4 deletions

View file

@ -229,7 +229,7 @@ public class ContributionsActivity
((MediaListAdapter)contributionsList.getAdapter()).updateMediaList((ArrayList<Media>) result);
}
}
notifyAndClearDataSetObservers();
notifyAndMigrateDataSetObservers();
}
public void onLoaderReset(Loader cursorLoader) {
@ -262,11 +262,19 @@ public class ContributionsActivity
// Do nothing for now
}
private void notifyAndClearDataSetObservers() {
private void notifyAndMigrateDataSetObservers() {
Adapter adapter = contributionsList.getAdapter();
// First, move the observers over to the adapter now that we have it.
for (DataSetObserver observer : observersWaitingForLoad) {
adapter.registerDataSetObserver(observer);
}
observersWaitingForLoad.clear();
// Now fire off a first notification...
for (DataSetObserver observer : observersWaitingForLoad) {
observer.onChanged();
}
observersWaitingForLoad.clear();
}
public void registerDataSetObserver(DataSetObserver observer) {
@ -283,7 +291,7 @@ public class ContributionsActivity
if (adapter == null) {
observersWaitingForLoad.remove(observer);
} else {
adapter.registerDataSetObserver(observer);
adapter.unregisterDataSetObserver(observer);
}
}

View file

@ -278,6 +278,10 @@ public class MediaDetailFragment extends SherlockFragment {
getView().getViewTreeObserver().removeOnScrollChangedListener(scrollListener);
scrollListener = null;
}
if (dataObserver != null) {
detailProvider.unregisterDataSetObserver(dataObserver);
dataObserver = null;
}
super.onDestroyView();
}