让我简化我的例子。想象一下,我有两个按钮。
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"。
由于我无法从主/UI 线程访问数据库,因此我从新线程执行它:
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修改推荐是从不同的活动/服务调用的,所以我应该使执行器服务成为静态的。我担心如果我将执行器服务设为静态并且不调用"shutdown((",那么可能会导致内存泄漏。
我想避免使用队列逻辑实现我自己的生产者/使用者设计模式。
感觉有一个简单的方法可以做到这一点,但我无法弄清楚。 :(
您需要在单个线程上运行所有更新。一种方法是使用 Looper
和 Handler
将消息发送到数据库更新线程,并按接收顺序执行这些消息。在更高级别,可以使用 Otto 等事件总线库来帮助促进这种线程间通信。