Android-如何在一个背景线程中排队多个作业



我想从Android中的主线程中运行多个耗时的功能,每当用户单击按钮时,我都会通过运行以下代码来进行操作。

Runnable runnable = new Runnable() {
    @Override
    public void run() {
        someHeavyBackgroundProcessing(); // takes ~ 3sec
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                reflectProcessingChangesInUI();
            }
        });
    }
};
new Thread(runnable).start();

问题是,当多个背景作业并行同时运行时,它们正在互相干扰。

我想要某种方法来拥有一个背景线程,并且任务将在那里排队,而不是并行执行。

因此总共有2个线程。UI的一个主线程,另一个背景线程用于所有重型处理,每个背景作业都会排队并一个接一个地处理。


干扰的示例 -

ui具有2个按钮 - 插入和显示

单击插入时,每次创建新的db实例并在每个插入后释放它。

因此,当用户点击在进行插入作业时显示时,用户只会看到已插入到该点击的行。

您可以使用Executors.newSingleThreadExecutor()。https://developer.android.com/reference/java/util/concurrent/concurrent/executors.html#newsinglethreathreadexecutor(java.util.concurrent.concurrent.threadfactory)

创建一个使用单个工人线程操作的执行人 无界队列

示例:

Runnable runnable = new Runnable() {
            @Override
            public void run() {
                someHeavyBackgroundProcessing(); // takes ~ 3sec
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        reflectProcessingChangesInUI();
                    }
                });
            }
        };
        Thread thread = new Thread(runnable);
        ExecutorService executor = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 5; ++i) {
            executor.execute(thread);
        }

最新更新