Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cf1517cf authored by Jason Chiu's avatar Jason Chiu
Browse files

Fix Settings creating too many threads unexpectedly

Provide a method to submit a Callable for execution in the shared
background thread pool.

Bug: 143434413
Test: manual, robotest
Change-Id: I149b5926f20acd0e43c4071cc35520c6bc50efef
Merged-In: I149b5926f20acd0e43c4071cc35520c6bc50efef
(cherry picked from commit ab21b8a8)
parent 002deeda
Loading
Loading
Loading
Loading
+19 −5
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.settingslib.utils;
import android.os.Handler;
import android.os.Looper;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
@@ -26,7 +27,7 @@ public class ThreadUtils {

    private static volatile Thread sMainThread;
    private static volatile Handler sMainThreadHandler;
    private static volatile ExecutorService sSingleThreadExecutor;
    private static volatile ExecutorService sThreadExecutor;

    /**
     * Returns true if the current thread is the UI thread.
@@ -64,10 +65,16 @@ public class ThreadUtils {
     * @Return A future of the task that can be monitored for updates or cancelled.
     */
    public static Future postOnBackgroundThread(Runnable runnable) {
        if (sSingleThreadExecutor == null) {
            sSingleThreadExecutor = Executors.newSingleThreadExecutor();
        return getThreadExecutor().submit(runnable);
    }
        return sSingleThreadExecutor.submit(runnable);

    /**
     * Posts callable in background using shared background thread pool.
     *
     * @Return A future of the task that can be monitored for updates or cancelled.
     */
    public static Future postOnBackgroundThread(Callable callable) {
        return getThreadExecutor().submit(callable);
    }

    /**
@@ -77,4 +84,11 @@ public class ThreadUtils {
        getUiThreadHandler().post(runnable);
    }

    private static synchronized ExecutorService getThreadExecutor() {
        if (sThreadExecutor == null) {
            sThreadExecutor = Executors.newFixedThreadPool(
                    Runtime.getRuntime().availableProcessors());
        }
        return sThreadExecutor;
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -50,7 +50,7 @@ public class ThreadUtilsTest {
    }

    @Test
    public void testPostOnMainThread_shouldRunOnMainTread() {
    public void testPostOnMainThread_shouldRunOnMainThread() {
        TestRunnable cr = new TestRunnable();
        ShadowLooper.pauseMainLooper();
        ThreadUtils.postOnMainThread(cr);