From 902d5ee79c8c0c7c17f0063ddacf0ab85dd8d34b Mon Sep 17 00:00:00 2001 From: Zoey Chen Date: Thu, 16 Jul 2020 16:45:21 +0800 Subject: [PATCH] Improve the performance of displaying preference - multithread. Test: manual test, use command to run MobileNetworkSettings and record it. Bug: 161691402 Change-Id: I33be3fab9eb470b48c0d0870d4c03cdaecbac334 --- .../AbstractMobileNetworkSettings.java | 1 - .../TelephonyStatusControlSession.java | 36 +++++++++---------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/com/android/settings/network/telephony/AbstractMobileNetworkSettings.java b/src/com/android/settings/network/telephony/AbstractMobileNetworkSettings.java index aa84cc14acd..ff831e85730 100644 --- a/src/com/android/settings/network/telephony/AbstractMobileNetworkSettings.java +++ b/src/com/android/settings/network/telephony/AbstractMobileNetworkSettings.java @@ -132,7 +132,6 @@ abstract class AbstractMobileNetworkSettings extends RestrictedDashboardFragment final TelephonyStatusControlSession session = setTelephonyAvailabilityStatus(controllers); - final PreferenceScreen screen = getPreferenceScreen(); controllers.forEach(controller -> { controller.displayPreference(screen); diff --git a/src/com/android/settings/network/telephony/TelephonyStatusControlSession.java b/src/com/android/settings/network/telephony/TelephonyStatusControlSession.java index 12c9beeef67..3716f1f864e 100644 --- a/src/com/android/settings/network/telephony/TelephonyStatusControlSession.java +++ b/src/com/android/settings/network/telephony/TelephonyStatusControlSession.java @@ -22,6 +22,7 @@ import com.android.settings.core.BasePreferenceController; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.utils.ThreadUtils; +import java.util.ArrayList; import java.util.Collection; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -37,7 +38,7 @@ public class TelephonyStatusControlSession implements AutoCloseable { private static final String LOG_TAG = "TelephonyStatusControlSS"; private Collection mControllers; - private Future mResult; + private Collection> mResult = new ArrayList<>(); /** * Buider of session @@ -67,9 +68,9 @@ public class TelephonyStatusControlSession implements AutoCloseable { private TelephonyStatusControlSession(Collection controllers) { mControllers = controllers; - mResult = ThreadUtils.postOnBackgroundThread(() -> - setupAvailabilityStatus(controllers) - ); + controllers.forEach(prefCtrl -> mResult + .add(ThreadUtils.postOnBackgroundThread(() -> setupAvailabilityStatus(prefCtrl)))); + } /** @@ -79,25 +80,24 @@ public class TelephonyStatusControlSession implements AutoCloseable { */ public void close() { //check the background thread is finished then unset the status of availability. - try { - mResult.get(); - } catch (ExecutionException | InterruptedException exception) { - Log.e(LOG_TAG, "setup availability status failed!", exception); + + for (Future result : mResult) { + try { + result.get(); + } catch (ExecutionException | InterruptedException exception) { + Log.e(LOG_TAG, "setup availability status failed!", exception); + } } unsetAvailabilityStatus(mControllers); } - private Boolean setupAvailabilityStatus( - Collection controllerLists) { + private Boolean setupAvailabilityStatus(AbstractPreferenceController controller) { try { - controllerLists.stream() - .filter(controller -> controller instanceof TelephonyAvailabilityHandler) - .map(TelephonyAvailabilityHandler.class::cast) - .forEach(controller -> { - int status = ((BasePreferenceController) controller) - .getAvailabilityStatus(); - controller.setAvailabilityStatus(status); - }); + if (controller instanceof TelephonyAvailabilityHandler) { + int status = ((BasePreferenceController) controller) + .getAvailabilityStatus(); + ((TelephonyAvailabilityHandler) controller).setAvailabilityStatus(status); + } return true; } catch (Exception exception) { Log.e(LOG_TAG, "Setup availability status failed!", exception);