如何在服务中读取数据并监听房间数据库中的更改?

我正在将用户信息存储在本地房间数据库中。在活动和片段中,我使用AndroidViewModel和LiveData来监听对数据库所做的更改并更新UI。

现在我想分析所有过去的用户数据,以便为将来的决策提供建议。我的建议会根据用户对数据库所做的每次更改而更改,因此我需要经常更新我的重新调整,同时一遍又一遍地执行相同的计算。

我正在考虑在应用程序启动上启动一项服务,该服务通过ViewModel和LiveData监听数据库更改并更新我的建议(这些建议也存储在同一数据库中)。但不知何故,服务不能

  1. 通过以下方式获取视图模型viewModel = ViewModelProviders.of(this).get(DataViewModel.class);
  2. 观察 LiveData 对象,因为它不是生命周期所有者。

基本上,我只需要从数据库中读取所有条目,分析数据并在每次数据库内容更改时更新5-10个值。

如果不在服务中,我应该如何以及在何处进行计算?也许我陷入了错误的想法,服务不是正确的方法,所以任何关于如何做到这一点的想法都非常值得赞赏!


答案 1

观察 LiveData 对象,因为它不是生命周期所有者

在 上使用,在 适当的时候手动通过 取消注册 (的服务,如果不是更早的话)。observeForever()LiveDataremoveObserver()onDestroy()

请记住,标准服务限制在这里适用(例如,服务在Android 8.0 +上运行约1分钟,除非它们是前台服务),因此您可能无论如何都需要考虑其他方法。


答案 2

我最终使用了服务并解决了我的问题,如下所示:

在我的方法中,我绑定到它:onCreateApplication objectMyService

serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder iBinder) {
            service = ((MyService.MyLocalBinder) iBinder ).getService();
        }
        @Override
        public void onServiceDisconnected(ComponentName name) {
        }
    };
Intent intent = new Intent(this, MyService.class);
getApplicationContext().bindService(intent, serviceConnection, BIND_AUTO_CREATE);

将服务绑定到应用程序上下文应使该服务保持活动状态,只要该应用程序未被销毁。在我得到一个ViewModel的实例,通过这样的MyServiceAndroidViewModelFactory

MyViewModel myViewModel = ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication()).create(MyViewModel.class);

并且我能够通过这样的方式从ViewModel中观察获取的实时数据observeForever

Observer<List<Entry>> obsEntries = new Observer<List<Entry>>() {
        @Override
        public void onChanged(@Nullable List<Entry> entries) {
            //perform calculations with entries in here
        }
    };
    viewModel.getEntries().observeForever(obsEntries);

重要:从服务的 LiveData 引用中删除观察者(这就是我保留对 Observer 对象的本地引用的原因):onDestroy

@Override
public void onDestroy() {
    super.onDestroy();
    viewModel.getEntries().removeObserver(obsEntries);
}

谢谢大家!


推荐