diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java index bbddd98d929..fbed5d2eed3 100644 --- a/src/com/android/settings/wifi/WifiSettings.java +++ b/src/com/android/settings/wifi/WifiSettings.java @@ -189,6 +189,8 @@ public class WifiSettings extends RestrictedSettingsFragment // Worker thread used for WifiPickerTracker work private HandlerThread mWorkerThread; + private Handler mMainHandler; + private Handler mWorkerHandler; @VisibleForTesting WifiPickerTracker mWifiPickerTracker; @@ -289,11 +291,13 @@ public class WifiSettings extends RestrictedSettingsFragment return SystemClock.elapsedRealtime(); } }; + + mMainHandler = new Handler(Looper.getMainLooper()); + mWorkerHandler = mWorkerThread.getThreadHandler(); mWifiPickerTracker = FeatureFactory.getFactory(context) .getWifiTrackerLibProvider() .createWifiPickerTracker(getSettingsLifecycle(), context, - new Handler(Looper.getMainLooper()), - mWorkerThread.getThreadHandler(), + mMainHandler, mWorkerHandler, elapsedRealtimeClock, MAX_SCAN_AGE_MILLIS, SCAN_INTERVAL_MILLIS, @@ -365,6 +369,10 @@ public class WifiSettings extends RestrictedSettingsFragment if (mWifiEnabler != null) { mWifiEnabler.teardownSwitchController(); } + + // remove all msg and callback in main handler and worker handler + mMainHandler.removeCallbacksAndMessages(null); + mWorkerHandler.removeCallbacksAndMessages(null); mWorkerThread.quit(); super.onDestroyView(); @@ -649,7 +657,7 @@ public class WifiSettings extends RestrictedSettingsFragment /** Called when the state of Wifi has changed. */ @Override public void onWifiStateChanged() { - if (mIsRestricted) { + if (mIsRestricted || isFinishingOrDestroyed()) { return; } final int wifiState = mWifiPickerTracker.getWifiState(); @@ -687,6 +695,10 @@ public class WifiSettings extends RestrictedSettingsFragment @Override public void onWifiEntriesChanged() { + if (isFinishingOrDestroyed()) { + return; + } + if (mIsWifiEntryListStale) { mIsWifiEntryListStale = false; updateWifiEntryPreferences(); diff --git a/tests/robotests/src/com/android/settings/wifi/WifiSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/WifiSettingsTest.java index c83ec49a40a..649f4cb45e4 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiSettingsTest.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiSettingsTest.java @@ -276,6 +276,11 @@ public class WifiSettingsTest { @Test public void onWifiEntriesChanged_shouldChangeNextButtonState() { + final FragmentActivity activity = mock(FragmentActivity.class); + doReturn(false).when(activity).isFinishing(); + doReturn(false).when(activity).isDestroyed(); + doReturn(activity).when(mWifiSettings).getActivity(); + mWifiSettings.onWifiEntriesChanged(); verify(mWifiSettings).changeNextButtonState(anyBoolean());