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 =
setTelephonyAvailabilityStatus(controllers);
final PreferenceScreen screen = getPreferenceScreen();
controllers.forEach(controller -> {
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.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<AbstractPreferenceController> mControllers;
private Future<Boolean> mResult;
private Collection<Future<Boolean>> mResult = new ArrayList<>();
/**
* Buider of session
@@ -67,9 +68,9 @@ public class TelephonyStatusControlSession implements AutoCloseable {
private TelephonyStatusControlSession(Collection<AbstractPreferenceController> 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.
for (Future<Boolean> result : mResult) {
try {
mResult.get();
result.get();
} catch (ExecutionException | InterruptedException exception) {
Log.e(LOG_TAG, "setup availability status failed!", exception);
}
}
unsetAvailabilityStatus(mControllers);
}
private Boolean setupAvailabilityStatus(
Collection<AbstractPreferenceController> controllerLists) {
private Boolean setupAvailabilityStatus(AbstractPreferenceController controller) {
try {
controllerLists.stream()
.filter(controller -> controller instanceof TelephonyAvailabilityHandler)
.map(TelephonyAvailabilityHandler.class::cast)
.forEach(controller -> {
if (controller instanceof TelephonyAvailabilityHandler) {
int status = ((BasePreferenceController) controller)
.getAvailabilityStatus();
controller.setAvailabilityStatus(status);
});
((TelephonyAvailabilityHandler) controller).setAvailabilityStatus(status);
}
return true;
} catch (Exception exception) {
Log.e(LOG_TAG, "Setup availability status failed!", exception);