【发布时间】:2018-06-18 18:09:35
【问题描述】:
我将用户信息存储在本地会议室数据库中。在活动和片段中,我使用 AndroidViewModel 和 LiveData 来监听对数据库所做的更改并更新 UI。
现在我想分析所有过去的用户数据,为未来的决策提供建议。我的建议会随着用户对数据库所做的每一次更改而改变,因此我需要经常更新我的建议,同时一遍又一遍地进行相同的计算。
我正在考虑在应用启动时启动一项服务,该服务通过 ViewModel 和 LiveData 侦听数据库更改并更新我的建议(这些建议也存储在同一个数据库中)。但不知何故,服务不能
- 通过
viewModel = ViewModelProviders.of(this).get(DataViewModel.class);获取 ViewModel - 观察 LiveData 对象,因为它不是 LifecycleOwner。
基本上我只需要从数据库中读取所有条目,分析数据并在每次数据库内容更改时更新 5-10 个值。
如果不在服务中,我应该如何以及在哪里进行计算?也许我陷入了错误的想法,而服务不是正确的方法,因此非常感谢任何关于如何做到这一点的想法!
【问题讨论】:
-
你可以选择 RxJava 吗?
-
@StefanoMtangoo 我对 RxJava 了解不多,除了它提供类似于 LiveData 的 Observables。你能告诉我一些关于你将如何使用 RxJava 来解决这个问题的细节吗?
-
如何“对数据库进行更改”?我们是在谈论一个绑定服务,它只在应用程序处于前台时才会运行?
-
@0X0nosugar 通过用户交互(EditTexts、按钮、开关等)对数据库进行更改,然后立即写入数据库。因此,只能在应用程序处于前台时进行更改。绑定服务-> 是的,如果我可以在应用程序进入后台后立即终止服务之前完成我的计算。绑定服务有可能吗?
-
“如果我能在服务被杀死之前完成我的计算”——这取决于计算需要多长时间。为了安全起见,可以启动一个 IntentService(它使用另一个线程进行工作,如果过早终止,它将重新启动)。 IntentService 通常会以某种方式保存其结果并发送本地广播以让感兴趣的各方知道它已完成其任务。现代变体:JobIntentService。一旦您的应用再次进入前台,一些 RecommendationsViewModel 的工作可能就是从存储中获取结果(如果有的话)
标签: java android android-service android-room android-viewmodel