From 3e4c47dbc090310edcf14b1c5094259f74ff0525 Mon Sep 17 00:00:00 2001 From: Jason Chiu Date: Mon, 28 Oct 2019 18:17:04 +0800 Subject: [PATCH] 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 --- .../contextualcards/ContextualCardLoader.java | 9 +++------ .../contextualcards/conditional/ConditionManager.java | 9 +++------ .../slices/NotificationChannelSlice.java | 11 +++-------- 3 files changed, 9 insertions(+), 20 deletions(-) diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java index 6d3649d4058..5a041438a2e 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.homepage.contextualcards.logging.ContextualCardLogUt 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 @@ public class ContextualCardLoader extends AsyncLoaderCompat 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 @@ public class ContextualCardLoader extends AsyncLoaderCompat ContextualCardLoader(Context context) { super(context); mContext = context.getApplicationContext(); - mExecutorService = Executors.newCachedThreadPool(); } @Override @@ -163,8 +160,8 @@ public class ContextualCardLoader extends AsyncLoaderCompat final List> 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 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 66f6c81e984..1beac9b87bf 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.NonNull; 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 @@ public class ConditionManager { 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 class ConditionManager { public ConditionManager(Context context, ConditionListener listener) { mAppContext = context.getApplicationContext(); - mExecutorService = Executors.newCachedThreadPool(); mCardControllers = new ArrayList<>(); mListener = listener; initCandidates(); @@ -64,8 +61,8 @@ public class ConditionManager { final List> 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 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 ff76779fd69..bdf97a802a0 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_LOW; 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.settings.slices.SliceBuilderUtils; 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 @@ public class NotificationChannelSlice implements CustomSliceable { }; protected final Context mContext; - private final ExecutorService mExecutorService; @VisibleForTesting NotificationBackend mNotificationBackend; private NotificationBackend.AppRow mAppRow; @@ -145,7 +141,6 @@ public class NotificationChannelSlice implements CustomSliceable { public NotificationChannelSlice(Context context) { mContext = context; mNotificationBackend = new NotificationBackend(); - mExecutorService = Executors.newCachedThreadPool(); } @Override @@ -376,9 +371,9 @@ public class NotificationChannelSlice implements CustomSliceable { // Create tasks to get notification data for multi-channel packages. final List> 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.