Change AppPrefLoader from AsyncTask to AsyncLoader.
Showing the wifi data usage results in reaching the max number of threads in the pool executor. Switching the loader implementation from Async task to AsynLoader and use a single loader to get the whole list of preferences instead of using a new task to create each list element. Change-Id: I0da19ca09031a7fa178970c192e12a99ab489145 Fix: 33820327 Test: make RunSettingsRoboTests
This commit is contained in:
@@ -30,7 +30,6 @@ import android.net.NetworkPolicy;
|
||||
import android.net.NetworkStatsHistory;
|
||||
import android.net.NetworkTemplate;
|
||||
import android.net.TrafficStats;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Bundle;
|
||||
import android.os.RemoteException;
|
||||
import android.os.UserHandle;
|
||||
@@ -55,11 +54,6 @@ import com.android.settingslib.net.ChartData;
|
||||
import com.android.settingslib.net.ChartDataLoader;
|
||||
import com.android.settingslib.net.UidDetailProvider;
|
||||
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class AppDataUsage extends DataUsageBase implements Preference.OnPreferenceChangeListener,
|
||||
DataSaverBackend.Listener {
|
||||
|
||||
@@ -78,6 +72,7 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen
|
||||
private static final String KEY_UNRESTRICTED_DATA = "unrestricted_data_saver";
|
||||
|
||||
private static final int LOADER_CHART_DATA = 2;
|
||||
private static final int LOADER_APP_PREF = 3;
|
||||
|
||||
private final ArraySet<String> mPackages = new ArraySet<>();
|
||||
private Preference mTotalUsage;
|
||||
@@ -104,12 +99,6 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen
|
||||
private SwitchPreference mUnrestrictedData;
|
||||
private DataSaverBackend mDataSaverBackend;
|
||||
|
||||
// Parameters to construct an efficient ThreadPoolExecutor
|
||||
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
|
||||
private static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));
|
||||
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
|
||||
private static final int KEEP_ALIVE_SECONDS = 30;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle icicle) {
|
||||
super.onCreate(icicle);
|
||||
@@ -196,14 +185,7 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen
|
||||
|
||||
if (mPackages.size() > 1) {
|
||||
mAppList = (PreferenceCategory) findPreference(KEY_APP_LIST);
|
||||
final int packageSize = mPackages.size();
|
||||
final BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(packageSize);
|
||||
final ThreadPoolExecutor executor = new ThreadPoolExecutor(CORE_POOL_SIZE,
|
||||
MAXIMUM_POOL_SIZE, KEEP_ALIVE_SECONDS, TimeUnit.SECONDS, workQueue);
|
||||
for (int i = 1; i < mPackages.size(); i++) {
|
||||
final AppPrefLoader loader = new AppPrefLoader();
|
||||
loader.executeOnExecutor(executor, mPackages.valueAt(i));
|
||||
}
|
||||
getLoaderManager().initLoader(LOADER_APP_PREF, Bundle.EMPTY, mAppPrefCallbacks);
|
||||
} else {
|
||||
removePreference(KEY_APP_LIST);
|
||||
}
|
||||
@@ -408,30 +390,27 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen
|
||||
}
|
||||
};
|
||||
|
||||
private class AppPrefLoader extends AsyncTask<String, Void, Preference> {
|
||||
@Override
|
||||
protected Preference doInBackground(String... params) {
|
||||
PackageManager pm = getPackageManager();
|
||||
String pkg = params[0];
|
||||
try {
|
||||
ApplicationInfo info = pm.getApplicationInfo(pkg, 0);
|
||||
Preference preference = new Preference(getPrefContext());
|
||||
preference.setIcon(info.loadIcon(pm));
|
||||
preference.setTitle(info.loadLabel(pm));
|
||||
preference.setSelectable(false);
|
||||
return preference;
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
private final LoaderManager.LoaderCallbacks<ArraySet<Preference>> mAppPrefCallbacks =
|
||||
new LoaderManager.LoaderCallbacks<ArraySet<Preference>>() {
|
||||
@Override
|
||||
public Loader<ArraySet<Preference>> onCreateLoader(int i, Bundle bundle) {
|
||||
return new AppPrefLoader(getPrefContext(), mPackages, getPackageManager());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(Preference pref) {
|
||||
if (pref != null && mAppList != null) {
|
||||
mAppList.addPreference(pref);
|
||||
@Override
|
||||
public void onLoadFinished(Loader<ArraySet<Preference>> loader,
|
||||
ArraySet<Preference> preferences) {
|
||||
if (preferences != null && mAppList != null) {
|
||||
for (Preference preference : preferences) {
|
||||
mAppList.addPreference(preference);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoaderReset(Loader<ArraySet<Preference>> loader) {
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public void onDataSaverChanged(boolean isDataSaving) {
|
||||
|
Reference in New Issue
Block a user