Merge "Fix Settings creating too many threads unexpectedly"

This commit is contained in:
TreeHugger Robot
2019-10-31 01:26:09 +00:00
committed by Android (Google) Code Review
3 changed files with 9 additions and 20 deletions

View File

@@ -37,12 +37,11 @@ import com.android.settings.homepage.contextualcards.logging.ContextualCardLogUt
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.utils.AsyncLoaderCompat; import com.android.settingslib.utils.AsyncLoaderCompat;
import com.android.settingslib.utils.ThreadUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
@@ -56,7 +55,6 @@ public class ContextualCardLoader extends AsyncLoaderCompat<List<ContextualCard>
private static final String TAG = "ContextualCardLoader"; private static final String TAG = "ContextualCardLoader";
private static final long ELIGIBILITY_CHECKER_TIMEOUT_MS = 250; private static final long ELIGIBILITY_CHECKER_TIMEOUT_MS = 250;
private final ExecutorService mExecutorService;
private final ContentObserver mObserver = new ContentObserver( private final ContentObserver mObserver = new ContentObserver(
new Handler(Looper.getMainLooper())) { new Handler(Looper.getMainLooper())) {
@Override @Override
@@ -76,7 +74,6 @@ public class ContextualCardLoader extends AsyncLoaderCompat<List<ContextualCard>
ContextualCardLoader(Context context) { ContextualCardLoader(Context context) {
super(context); super(context);
mContext = context.getApplicationContext(); mContext = context.getApplicationContext();
mExecutorService = Executors.newCachedThreadPool();
} }
@Override @Override
@@ -163,8 +160,8 @@ public class ContextualCardLoader extends AsyncLoaderCompat<List<ContextualCard>
final List<Future<ContextualCard>> eligibleCards = new ArrayList<>(); final List<Future<ContextualCard>> eligibleCards = new ArrayList<>();
for (ContextualCard card : candidates) { for (ContextualCard card : candidates) {
final EligibleCardChecker future = new EligibleCardChecker(mContext, card); final EligibleCardChecker checker = new EligibleCardChecker(mContext, card);
eligibleCards.add(mExecutorService.submit(future)); eligibleCards.add(ThreadUtils.postOnBackgroundThread(checker));
} }
// Collect future and eligible cards // Collect future and eligible cards
for (Future<ContextualCard> cardFuture : eligibleCards) { for (Future<ContextualCard> cardFuture : eligibleCards) {

View File

@@ -23,13 +23,12 @@ import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import com.android.settings.homepage.contextualcards.ContextualCard; import com.android.settings.homepage.contextualcards.ContextualCard;
import com.android.settingslib.utils.ThreadUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
@@ -42,7 +41,6 @@ public class ConditionManager {
private static final long DISPLAYABLE_CHECKER_TIMEOUT_MS = 20; private static final long DISPLAYABLE_CHECKER_TIMEOUT_MS = 20;
private final ExecutorService mExecutorService;
private final Context mAppContext; private final Context mAppContext;
private final ConditionListener mListener; private final ConditionListener mListener;
@@ -50,7 +48,6 @@ public class ConditionManager {
public ConditionManager(Context context, ConditionListener listener) { public ConditionManager(Context context, ConditionListener listener) {
mAppContext = context.getApplicationContext(); mAppContext = context.getApplicationContext();
mExecutorService = Executors.newCachedThreadPool();
mCardControllers = new ArrayList<>(); mCardControllers = new ArrayList<>();
mListener = listener; mListener = listener;
initCandidates(); initCandidates();
@@ -64,8 +61,8 @@ public class ConditionManager {
final List<Future<ContextualCard>> displayableCards = new ArrayList<>(); final List<Future<ContextualCard>> displayableCards = new ArrayList<>();
// Check displayable future // Check displayable future
for (ConditionalCardController card : mCardControllers) { for (ConditionalCardController card : mCardControllers) {
final DisplayableChecker future = new DisplayableChecker(getController(card.getId())); final DisplayableChecker checker = new DisplayableChecker(getController(card.getId()));
displayableCards.add(mExecutorService.submit(future)); displayableCards.add(ThreadUtils.postOnBackgroundThread(checker));
} }
// Collect future and add displayable cards // Collect future and add displayable cards
for (Future<ContextualCard> cardFuture : displayableCards) { for (Future<ContextualCard> cardFuture : displayableCards) {

View File

@@ -20,8 +20,6 @@ import static android.app.NotificationManager.IMPORTANCE_LOW;
import static android.app.NotificationManager.IMPORTANCE_NONE; import static android.app.NotificationManager.IMPORTANCE_NONE;
import static android.app.slice.Slice.EXTRA_TOGGLE_STATE; 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.Application;
import android.app.NotificationChannel; import android.app.NotificationChannel;
import android.app.NotificationChannelGroup; import android.app.NotificationChannelGroup;
@@ -62,13 +60,12 @@ import com.android.settings.slices.SliceBuilderUtils;
import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.utils.ThreadUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
@@ -135,7 +132,6 @@ public class NotificationChannelSlice implements CustomSliceable {
}; };
protected final Context mContext; protected final Context mContext;
private final ExecutorService mExecutorService;
@VisibleForTesting @VisibleForTesting
NotificationBackend mNotificationBackend; NotificationBackend mNotificationBackend;
private NotificationBackend.AppRow mAppRow; private NotificationBackend.AppRow mAppRow;
@@ -145,7 +141,6 @@ public class NotificationChannelSlice implements CustomSliceable {
public NotificationChannelSlice(Context context) { public NotificationChannelSlice(Context context) {
mContext = context; mContext = context;
mNotificationBackend = new NotificationBackend(); mNotificationBackend = new NotificationBackend();
mExecutorService = Executors.newCachedThreadPool();
} }
@Override @Override
@@ -376,9 +371,9 @@ public class NotificationChannelSlice implements CustomSliceable {
// Create tasks to get notification data for multi-channel packages. // Create tasks to get notification data for multi-channel packages.
final List<Future<NotificationBackend.AppRow>> appRowTasks = new ArrayList<>(); final List<Future<NotificationBackend.AppRow>> appRowTasks = new ArrayList<>();
for (PackageInfo packageInfo : packageInfoList) { for (PackageInfo packageInfo : packageInfoList) {
final NotificationMultiChannelAppRow future = new NotificationMultiChannelAppRow( final NotificationMultiChannelAppRow appRow = new NotificationMultiChannelAppRow(
mContext, mNotificationBackend, packageInfo); 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. // Get the package which has sent at least ~10 notifications and not turn off channels.