From 2710b99d2f5dfd461f0cd723ba37407032fc8a5b Mon Sep 17 00:00:00 2001 From: liurong Date: Fri, 24 Mar 2017 20:11:48 +0800 Subject: [PATCH] [VpnSettings]Crash when activity has been recycled This is a case we found in monkey test, the main thread handles message while the activity has been recycled. It will raise a NullPointerException when we use getActivity() in following lines. Assumpt the situation is: settings run in background and activity been recycled quickly, but handler still in the process. Test: NA Change-Id: I19db4f13e13294618ec8e42e4d9c54ce23504344 Signed-off-by: liurong --- src/com/android/settings/vpn2/VpnSettings.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/vpn2/VpnSettings.java b/src/com/android/settings/vpn2/VpnSettings.java index 0d968abc9b3..29a67ab5ec8 100644 --- a/src/com/android/settings/vpn2/VpnSettings.java +++ b/src/com/android/settings/vpn2/VpnSettings.java @@ -19,6 +19,7 @@ package com.android.settings.vpn2; import android.annotation.UiThread; import android.annotation.WorkerThread; import android.app.AppOpsManager; +import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; @@ -208,9 +209,16 @@ public class VpnSettings extends RestrictedSettingsFragment implements public boolean handleMessage(Message message) { mUpdater.removeMessages(RESCAN_MESSAGE); + //Return if activity has been recycled + final Activity activity = getActivity(); + if (activity == null) { + return true; + } + final Context context = activity.getApplicationContext(); + // Run heavy RPCs before switching to UI thread final List vpnProfiles = loadVpnProfiles(mKeyStore); - final List vpnApps = getVpnApps(getActivity(), /* includeProfiles */ true); + final List vpnApps = getVpnApps(context, /* includeProfiles */ true); final Map connectedLegacyVpns = getConnectedLegacyVpns(); final Set connectedAppVpns = getConnectedAppVpns(); @@ -219,7 +227,7 @@ public class VpnSettings extends RestrictedSettingsFragment implements final String lockdownVpnKey = VpnUtils.getLockdownVpn(); // Refresh list of VPNs - getActivity().runOnUiThread(new Runnable() { + activity.runOnUiThread(new Runnable() { @Override public void run() { // Can't do anything useful if the context has gone away @@ -271,7 +279,6 @@ public class VpnSettings extends RestrictedSettingsFragment implements } } }); - mUpdater.sendEmptyMessageDelayed(RESCAN_MESSAGE, RESCAN_INTERVAL_MS); return true; }