Merge "Improve the performance of displaying preference - multithread."

This commit is contained in:
Zoey Chen
2020-07-21 10:35:06 +00:00
committed by Android (Google) Code Review
2 changed files with 18 additions and 19 deletions

View File

@@ -132,7 +132,6 @@ abstract class AbstractMobileNetworkSettings extends RestrictedDashboardFragment
final TelephonyStatusControlSession session = final TelephonyStatusControlSession session =
setTelephonyAvailabilityStatus(controllers); setTelephonyAvailabilityStatus(controllers);
final PreferenceScreen screen = getPreferenceScreen(); final PreferenceScreen screen = getPreferenceScreen();
controllers.forEach(controller -> { controllers.forEach(controller -> {
controller.displayPreference(screen); controller.displayPreference(screen);

View File

@@ -22,6 +22,7 @@ import com.android.settings.core.BasePreferenceController;
import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.utils.ThreadUtils; import com.android.settingslib.utils.ThreadUtils;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future; import java.util.concurrent.Future;
@@ -37,7 +38,7 @@ public class TelephonyStatusControlSession implements AutoCloseable {
private static final String LOG_TAG = "TelephonyStatusControlSS"; private static final String LOG_TAG = "TelephonyStatusControlSS";
private Collection<AbstractPreferenceController> mControllers; private Collection<AbstractPreferenceController> mControllers;
private Future<Boolean> mResult; private Collection<Future<Boolean>> mResult = new ArrayList<>();
/** /**
* Buider of session * Buider of session
@@ -67,9 +68,9 @@ public class TelephonyStatusControlSession implements AutoCloseable {
private TelephonyStatusControlSession(Collection<AbstractPreferenceController> controllers) { private TelephonyStatusControlSession(Collection<AbstractPreferenceController> controllers) {
mControllers = controllers; mControllers = controllers;
mResult = ThreadUtils.postOnBackgroundThread(() -> controllers.forEach(prefCtrl -> mResult
setupAvailabilityStatus(controllers) .add(ThreadUtils.postOnBackgroundThread(() -> setupAvailabilityStatus(prefCtrl))));
);
} }
/** /**
@@ -79,25 +80,24 @@ public class TelephonyStatusControlSession implements AutoCloseable {
*/ */
public void close() { public void close() {
//check the background thread is finished then unset the status of availability. //check the background thread is finished then unset the status of availability.
for (Future<Boolean> result : mResult) {
try { try {
mResult.get(); result.get();
} catch (ExecutionException | InterruptedException exception) { } catch (ExecutionException | InterruptedException exception) {
Log.e(LOG_TAG, "setup availability status failed!", exception); Log.e(LOG_TAG, "setup availability status failed!", exception);
} }
}
unsetAvailabilityStatus(mControllers); unsetAvailabilityStatus(mControllers);
} }
private Boolean setupAvailabilityStatus( private Boolean setupAvailabilityStatus(AbstractPreferenceController controller) {
Collection<AbstractPreferenceController> controllerLists) {
try { try {
controllerLists.stream() if (controller instanceof TelephonyAvailabilityHandler) {
.filter(controller -> controller instanceof TelephonyAvailabilityHandler)
.map(TelephonyAvailabilityHandler.class::cast)
.forEach(controller -> {
int status = ((BasePreferenceController) controller) int status = ((BasePreferenceController) controller)
.getAvailabilityStatus(); .getAvailabilityStatus();
controller.setAvailabilityStatus(status); ((TelephonyAvailabilityHandler) controller).setAvailabilityStatus(status);
}); }
return true; return true;
} catch (Exception exception) { } catch (Exception exception) {
Log.e(LOG_TAG, "Setup availability status failed!", exception); Log.e(LOG_TAG, "Setup availability status failed!", exception);