【发布时间】:2018-06-14 06:25:10
【问题描述】:
我的应用程序有一个前台服务,我希望我的所有网络调用都发生在其中,以保持事情正常。我还在 Service 中实现了 Room 数据库。
我的计划是在服务端基于触发器进行所有数据库操作。广播在 Intent 中以 Bundle 的形式将数据传递给服务。
但是,我的问题是:
- BroadcastListeners 在主线程上运行。
- Room DB 操作需要脱离主线程,这样应用才不会 ANR'd
- 当我在 BroadcastListener 中实现 HandlerThread 或具有 Runnable 的线程时,我无法传递数据,因为意图变量是“从内部类访问的,需要声明为 final”
我的代码(就目前而言)如下。
BroadcastReceiver houseCallCancelReceiver = new BroadcastReceiver () {
@Override
public void onReceive(Context context, Intent intent) {
new Thread(new Runnable() {
@Override
public void run() {
Bundle bundle = intent.getParcelableExtra ("housecall");
String email = bundle.getString("email");
String housecallid = bundle.getString("housecallid");
.
.
.
}
}
}).start();
}
};
ATM 我能想到几个选项,包括:
- 在函数中编写 DB 逻辑(和线程)并传递 意图作为线程的参数。 - 这导致代码是 不是全部在一起,而且更难阅读,因为我会有一个 每个操作的功能
- 在 AsyncTask 中进行调用 - 与上述相同,外加大量一次性 AsyncTask 调用。另外,我可以在 ForegroundService 中调用 AsyncTask 吗?
- 升级到 Java 1.8 并使用 Lambda - 我担心这可能会破坏与旧手机的兼容性。
非常感谢任何帮助!
【问题讨论】:
标签: android multithreading android-room