Fix crash on Wi-Fi Slice when it's continuously pinned and unpinned
It's because WifiTracker's initialization and onStop is on different thread. Fine tune the thread logic in SliceBackgroundWorker. Fixes: 118165942 Test: manual Change-Id: Icc86b5df7ec3c6fd0e4a79a62ea0c84465e9528d
This commit is contained in:
@@ -52,6 +52,7 @@ import com.android.settings.wifi.calling.WifiCallingSliceHelper;
|
||||
import com.android.settingslib.SliceBroadcastRelay;
|
||||
import com.android.settingslib.utils.ThreadUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
@@ -134,6 +135,7 @@ public class SettingsSliceProvider extends SliceProvider {
|
||||
final Set<Uri> mRegisteredUris = new ArraySet<>();
|
||||
|
||||
final Map<Uri, SliceBackgroundWorker> mWorkerMap = new ArrayMap<>();
|
||||
final Set<SliceBackgroundWorker> mLiveWorkers = new ArraySet<>();
|
||||
|
||||
public SettingsSliceProvider() {
|
||||
super(READ_SEARCH_INDEXABLES);
|
||||
@@ -169,7 +171,9 @@ public class SettingsSliceProvider extends SliceProvider {
|
||||
if (filter != null) {
|
||||
registerIntentToUri(filter, sliceUri);
|
||||
}
|
||||
startBackgroundWorker(sliceable);
|
||||
ThreadUtils.postOnMainThread(() -> {
|
||||
startBackgroundWorker(sliceable);
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -198,7 +202,9 @@ public class SettingsSliceProvider extends SliceProvider {
|
||||
SliceBroadcastRelay.unregisterReceivers(getContext(), sliceUri);
|
||||
mRegisteredUris.remove(sliceUri);
|
||||
}
|
||||
stopBackgroundWorker(sliceUri);
|
||||
ThreadUtils.postOnMainThread(() -> {
|
||||
stopBackgroundWorker(sliceUri);
|
||||
});
|
||||
mSliceDataCache.remove(sliceUri);
|
||||
}
|
||||
|
||||
@@ -365,12 +371,15 @@ public class SettingsSliceProvider extends SliceProvider {
|
||||
}
|
||||
|
||||
final Uri uri = sliceable.getUri();
|
||||
Log.d(TAG, "Starting background worker for: " + uri);
|
||||
if (mWorkerMap.containsKey(uri)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Log.d(TAG, "Starting background worker for: " + uri);
|
||||
mWorkerMap.put(uri, worker);
|
||||
if (!mLiveWorkers.contains(worker)) {
|
||||
mLiveWorkers.add(worker);
|
||||
}
|
||||
worker.onSlicePinned();
|
||||
}
|
||||
|
||||
@@ -383,6 +392,20 @@ public class SettingsSliceProvider extends SliceProvider {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void shutdown() {
|
||||
for (SliceBackgroundWorker worker : mLiveWorkers) {
|
||||
ThreadUtils.postOnMainThread(() -> {
|
||||
try {
|
||||
worker.close();
|
||||
} catch (IOException e) {
|
||||
Log.w(TAG, "Exception when shutting down worker", e);
|
||||
}
|
||||
});
|
||||
}
|
||||
mLiveWorkers.clear();
|
||||
}
|
||||
|
||||
private List<Uri> buildUrisFromKeys(List<String> keys, String authority) {
|
||||
final List<Uri> descendants = new ArrayList<>();
|
||||
|
||||
|
||||
@@ -16,9 +16,11 @@
|
||||
|
||||
package com.android.settings.slices;
|
||||
|
||||
import android.annotation.MainThread;
|
||||
import android.content.ContentResolver;
|
||||
import android.net.Uri;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -32,7 +34,7 @@ import java.util.List;
|
||||
* {@link SliceBackgroundWorker} caches the results, uses the cache to compare if there is any data
|
||||
* changed, and then notifies the Slice {@link Uri} to update.
|
||||
*/
|
||||
public abstract class SliceBackgroundWorker<E> {
|
||||
public abstract class SliceBackgroundWorker<E> implements Closeable {
|
||||
|
||||
private final ContentResolver mContentResolver;
|
||||
private final Uri mUri;
|
||||
@@ -48,12 +50,14 @@ public abstract class SliceBackgroundWorker<E> {
|
||||
* Called when the Slice is pinned. This is the place to register callbacks or initialize scan
|
||||
* tasks.
|
||||
*/
|
||||
@MainThread
|
||||
protected abstract void onSlicePinned();
|
||||
|
||||
/**
|
||||
* Called when the Slice is unpinned. This is the place to unregister callbacks or perform any
|
||||
* final cleanup.
|
||||
*/
|
||||
@MainThread
|
||||
protected abstract void onSliceUnpinned();
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user