Fix Settings creating too many threads unexpectedly
Limit the number of threads by using the shared thread pool in
ThreadUtils.
Bug: 143434413
Test: manual
Change-Id: I4afe1f641a11e218616772c1d5446efcc99cd1cc
Merged-In: I4afe1f641a11e218616772c1d5446efcc99cd1cc
(cherry picked from commit 3e4c47dbc090310edcf14b1c5094259f74ff0525)
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
index 6d3649d..5a04143 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
@@ -37,12 +37,11 @@
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.utils.AsyncLoaderCompat;
+import com.android.settingslib.utils.ThreadUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@@ -56,7 +55,6 @@
private static final String TAG = "ContextualCardLoader";
private static final long ELIGIBILITY_CHECKER_TIMEOUT_MS = 250;
- private final ExecutorService mExecutorService;
private final ContentObserver mObserver = new ContentObserver(
new Handler(Looper.getMainLooper())) {
@Override
@@ -76,7 +74,6 @@
ContextualCardLoader(Context context) {
super(context);
mContext = context.getApplicationContext();
- mExecutorService = Executors.newCachedThreadPool();
}
@Override
@@ -163,8 +160,8 @@
final List<Future<ContextualCard>> eligibleCards = new ArrayList<>();
for (ContextualCard card : candidates) {
- final EligibleCardChecker future = new EligibleCardChecker(mContext, card);
- eligibleCards.add(mExecutorService.submit(future));
+ final EligibleCardChecker checker = new EligibleCardChecker(mContext, card);
+ eligibleCards.add(ThreadUtils.postOnBackgroundThread(checker));
}
// Collect future and eligible cards
for (Future<ContextualCard> cardFuture : eligibleCards) {
diff --git a/src/com/android/settings/homepage/contextualcards/conditional/ConditionManager.java b/src/com/android/settings/homepage/contextualcards/conditional/ConditionManager.java
index 66f6c81..1beac9b 100644
--- a/src/com/android/settings/homepage/contextualcards/conditional/ConditionManager.java
+++ b/src/com/android/settings/homepage/contextualcards/conditional/ConditionManager.java
@@ -23,13 +23,12 @@
import androidx.annotation.VisibleForTesting;
import com.android.settings.homepage.contextualcards.ContextualCard;
+import com.android.settingslib.utils.ThreadUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@@ -42,7 +41,6 @@
private static final long DISPLAYABLE_CHECKER_TIMEOUT_MS = 20;
- private final ExecutorService mExecutorService;
private final Context mAppContext;
private final ConditionListener mListener;
@@ -50,7 +48,6 @@
public ConditionManager(Context context, ConditionListener listener) {
mAppContext = context.getApplicationContext();
- mExecutorService = Executors.newCachedThreadPool();
mCardControllers = new ArrayList<>();
mListener = listener;
initCandidates();
@@ -64,8 +61,8 @@
final List<Future<ContextualCard>> displayableCards = new ArrayList<>();
// Check displayable future
for (ConditionalCardController card : mCardControllers) {
- final DisplayableChecker future = new DisplayableChecker(getController(card.getId()));
- displayableCards.add(mExecutorService.submit(future));
+ final DisplayableChecker checker = new DisplayableChecker(getController(card.getId()));
+ displayableCards.add(ThreadUtils.postOnBackgroundThread(checker));
}
// Collect future and add displayable cards
for (Future<ContextualCard> cardFuture : displayableCards) {
diff --git a/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java b/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java
index ff76779..bdf97a8 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java
@@ -20,8 +20,6 @@
import static android.app.NotificationManager.IMPORTANCE_NONE;
import static android.app.slice.Slice.EXTRA_TOGGLE_STATE;
-import static com.android.settings.notification.ChannelListPreferenceController.ARG_FROM_SETTINGS;
-
import android.app.Application;
import android.app.NotificationChannel;
import android.app.NotificationChannelGroup;
@@ -62,13 +60,12 @@
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.applications.ApplicationsState;
+import com.android.settingslib.utils.ThreadUtils;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@@ -135,7 +132,6 @@
};
protected final Context mContext;
- private final ExecutorService mExecutorService;
@VisibleForTesting
NotificationBackend mNotificationBackend;
private NotificationBackend.AppRow mAppRow;
@@ -145,7 +141,6 @@
public NotificationChannelSlice(Context context) {
mContext = context;
mNotificationBackend = new NotificationBackend();
- mExecutorService = Executors.newCachedThreadPool();
}
@Override
@@ -376,9 +371,9 @@
// Create tasks to get notification data for multi-channel packages.
final List<Future<NotificationBackend.AppRow>> appRowTasks = new ArrayList<>();
for (PackageInfo packageInfo : packageInfoList) {
- final NotificationMultiChannelAppRow future = new NotificationMultiChannelAppRow(
+ final NotificationMultiChannelAppRow appRow = new NotificationMultiChannelAppRow(
mContext, mNotificationBackend, packageInfo);
- appRowTasks.add(mExecutorService.submit(future));
+ appRowTasks.add(ThreadUtils.postOnBackgroundThread(appRow));
}
// Get the package which has sent at least ~10 notifications and not turn off channels.