让我简化一下我的例子。想象一下,我有两个按钮。
btn_A.setOnClickListener(v -> {
// update ROOM DB value to A
});
btn_B.setOnClickListener(v -> {
// update ROOM DB value to B
});
按钮A将DB值设置为' A'。
按钮B将DB值设置为' B'。
由于我无法从Main / UI线程访问DB,因此我从新线程执行它:
btn_A.setOnClickListener(v -> {
new Thread(() -> {
// update ROOM DB value to A
}).start();
});
btn_B.setOnClickListener(v -> {
new Thread(() -> {
// update ROOM DB value to B
}).start();
});
如果我按下按钮A,B,A,B ......,那么我担心新线程不会连续执行(按顺序)。
我考虑过将ExecutorService与Executors.newFixedThreadPool(1)一起使用,但我不确定这是否会按顺序运行工作线程。此外,DB修改表示从不同的活动/服务调用,因此我应该使ExecutorService静态。我担心如果我将ExecutorService设置为静态并且不打电话给#shutdown;()',那么可能会导致内存泄漏。
我想避免使用队列逻辑实现我自己的生产者/消费者设计模式。
感觉有一种简单的方法可以做到,但我无法弄明白。 :(
答案 0 :(得分:0)
您需要在单个线程上运行所有更新。一种方法是使用Looper
和Handler
以便将消息发送到数据库更新线程,并按接收的顺序执行这些消息。在更高级别,您可以使用像Otto这样的事件总线库来帮助促进这种线程间通信。