我想从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);
}