Skip to content

Commit 47af8f6

Browse files
committed
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
1 parent b3771e1 commit 47af8f6

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

commons/src/main/java/org/wikimedia/commons/contributions/ContributionsActivity.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ public void onLoadFinished(Loader cursorLoader, Object result) {
229229
((MediaListAdapter)contributionsList.getAdapter()).updateMediaList((ArrayList<Media>) result);
230230
}
231231
}
232-
notifyAndClearDataSetObservers();
232+
notifyAndMigrateDataSetObservers();
233233
}
234234

235235
public void onLoaderReset(Loader cursorLoader) {
@@ -262,11 +262,19 @@ public void notifyDatasetChanged() {
262262
// Do nothing for now
263263
}
264264

265-
private void notifyAndClearDataSetObservers() {
265+
private void notifyAndMigrateDataSetObservers() {
266+
Adapter adapter = contributionsList.getAdapter();
267+
268+
// First, move the observers over to the adapter now that we have it.
266269
for (DataSetObserver observer : observersWaitingForLoad) {
267-
observer.onChanged();
270+
adapter.registerDataSetObserver(observer);
268271
}
269272
observersWaitingForLoad.clear();
273+
274+
// Now fire off a first notification...
275+
for (DataSetObserver observer : observersWaitingForLoad) {
276+
observer.onChanged();
277+
}
270278
}
271279

272280
public void registerDataSetObserver(DataSetObserver observer) {
@@ -283,7 +291,7 @@ public void unregisterDataSetObserver(DataSetObserver observer) {
283291
if (adapter == null) {
284292
observersWaitingForLoad.remove(observer);
285293
} else {
286-
adapter.registerDataSetObserver(observer);
294+
adapter.unregisterDataSetObserver(observer);
287295
}
288296
}
289297

commons/src/main/java/org/wikimedia/commons/media/MediaDetailFragment.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,10 @@ public void onDestroyView() {
278278
getView().getViewTreeObserver().removeOnScrollChangedListener(scrollListener);
279279
scrollListener = null;
280280
}
281+
if (dataObserver != null) {
282+
detailProvider.unregisterDataSetObserver(dataObserver);
283+
dataObserver = null;
284+
}
281285
super.onDestroyView();
282286
}
283287

0 commit comments

Comments
 (0)