[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 <liurong@xiaomi.com>
This commit is contained in:
liurong
2017-03-24 20:11:48 +08:00
committed by Robin Lee
parent c2daeaf7e7
commit 2710b99d2f

View File

@@ -19,6 +19,7 @@ package com.android.settings.vpn2;
import android.annotation.UiThread; import android.annotation.UiThread;
import android.annotation.WorkerThread; import android.annotation.WorkerThread;
import android.app.AppOpsManager; import android.app.AppOpsManager;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
@@ -208,9 +209,16 @@ public class VpnSettings extends RestrictedSettingsFragment implements
public boolean handleMessage(Message message) { public boolean handleMessage(Message message) {
mUpdater.removeMessages(RESCAN_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 // Run heavy RPCs before switching to UI thread
final List<VpnProfile> vpnProfiles = loadVpnProfiles(mKeyStore); final List<VpnProfile> vpnProfiles = loadVpnProfiles(mKeyStore);
final List<AppVpnInfo> vpnApps = getVpnApps(getActivity(), /* includeProfiles */ true); final List<AppVpnInfo> vpnApps = getVpnApps(context, /* includeProfiles */ true);
final Map<String, LegacyVpnInfo> connectedLegacyVpns = getConnectedLegacyVpns(); final Map<String, LegacyVpnInfo> connectedLegacyVpns = getConnectedLegacyVpns();
final Set<AppVpnInfo> connectedAppVpns = getConnectedAppVpns(); final Set<AppVpnInfo> connectedAppVpns = getConnectedAppVpns();
@@ -219,7 +227,7 @@ public class VpnSettings extends RestrictedSettingsFragment implements
final String lockdownVpnKey = VpnUtils.getLockdownVpn(); final String lockdownVpnKey = VpnUtils.getLockdownVpn();
// Refresh list of VPNs // Refresh list of VPNs
getActivity().runOnUiThread(new Runnable() { activity.runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
// Can't do anything useful if the context has gone away // 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); mUpdater.sendEmptyMessageDelayed(RESCAN_MESSAGE, RESCAN_INTERVAL_MS);
return true; return true;
} }