diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java index f0ae90e100d..7f41f3645c3 100644 --- a/src/com/android/settings/wifi/WifiSettings.java +++ b/src/com/android/settings/wifi/WifiSettings.java @@ -190,6 +190,8 @@ public class WifiSettings extends RestrictedSettingsFragment // Worker thread used for WifiPickerTracker work private HandlerThread mWorkerThread; + private Handler mMainHandler; + private Handler mWorkerHandler; @VisibleForTesting WifiPickerTracker mWifiPickerTracker; @@ -290,11 +292,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, @@ -366,6 +370,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(); @@ -650,7 +658,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(); @@ -688,6 +696,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 5f2f5647c51..abed4479f4a 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiSettingsTest.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiSettingsTest.java @@ -277,6 +277,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());