Fix ApplicationWrapper activity weakRef leak (#1301)
Summary: Fix for https://github.com/facebook/flipper/issues/1300 The weak refs were not being cleared in two cases: - On config changes, isFinishing() would be false in onPause() - When calling finish() from Activity.onCreate(), onPause() isn't guaranteed to be called. ## Changelog Pull Request resolved: https://github.com/facebook/flipper/pull/1301 Reviewed By: mweststrate Differential Revision: D22286182 Pulled By: passy fbshipit-source-id: 948d1d9b2145b6526c0030cf537330409ff7f8c4
This commit is contained in:
committed by
Facebook GitHub Bot
parent
c8af6da236
commit
cfd8662c12
@@ -54,19 +54,7 @@ public class ApplicationWrapper implements Application.ActivityLifecycleCallback
|
|||||||
public void onActivityResumed(Activity activity) {}
|
public void onActivityResumed(Activity activity) {}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onActivityPaused(Activity activity) {
|
public void onActivityPaused(Activity activity) {}
|
||||||
if (activity.isFinishing()) {
|
|
||||||
final Iterator<WeakReference<Activity>> activityIterator = mActivities.iterator();
|
|
||||||
|
|
||||||
while (activityIterator.hasNext()) {
|
|
||||||
if (activityIterator.next().get() == activity) {
|
|
||||||
activityIterator.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
notifyListener();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onActivityStopped(Activity activity) {}
|
public void onActivityStopped(Activity activity) {}
|
||||||
@@ -75,7 +63,16 @@ public class ApplicationWrapper implements Application.ActivityLifecycleCallback
|
|||||||
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
|
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onActivityDestroyed(Activity activity) {}
|
public void onActivityDestroyed(Activity activity) {
|
||||||
|
final Iterator<WeakReference<Activity>> activityIterator = mActivities.iterator();
|
||||||
|
|
||||||
|
while (activityIterator.hasNext()) {
|
||||||
|
if (activityIterator.next().get() == activity) {
|
||||||
|
activityIterator.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
notifyListener();
|
||||||
|
}
|
||||||
|
|
||||||
private void notifyListener() {
|
private void notifyListener() {
|
||||||
if (mListener != null) {
|
if (mListener != null) {
|
||||||
|
|||||||
@@ -85,6 +85,21 @@ public class ApplicationWrapperTest {
|
|||||||
Mockito.when(activity2.isFinishing()).thenReturn(true);
|
Mockito.when(activity2.isFinishing()).thenReturn(true);
|
||||||
mCallbacks.onActivityPaused(activity2);
|
mCallbacks.onActivityPaused(activity2);
|
||||||
|
|
||||||
|
assertThat(mWrapper.getActivityStack().size(), equalTo(2));
|
||||||
|
assertThat(mWrapper.getActivityStack().get(0), equalTo(activity1));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testActivityDestroyed() {
|
||||||
|
final Activity activity1 = Mockito.mock(Activity.class);
|
||||||
|
mCallbacks.onActivityCreated(activity1, Mockito.mock(Bundle.class));
|
||||||
|
|
||||||
|
final Activity activity2 = Mockito.mock(Activity.class);
|
||||||
|
mCallbacks.onActivityCreated(activity2, Mockito.mock(Bundle.class));
|
||||||
|
|
||||||
|
Mockito.when(activity2.isFinishing()).thenReturn(true);
|
||||||
|
mCallbacks.onActivityDestroyed(activity2);
|
||||||
|
|
||||||
assertThat(mWrapper.getActivityStack().size(), equalTo(1));
|
assertThat(mWrapper.getActivityStack().size(), equalTo(1));
|
||||||
assertThat(mWrapper.getActivityStack().get(0), equalTo(activity1));
|
assertThat(mWrapper.getActivityStack().get(0), equalTo(activity1));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user