viewmodel - 在 ViewModel 构造函数上初始化 LiveData
问题描述
我只是android编程的初学者。最近我正在阅读有关房间数据库如何在对数据库进行更改时返回实时数据以进行自动更新的信息。我正在使用 viewmodel 类实例来保存我的 Livedata,如下所示
public class LogVM extends AndroidViewModel{
MasterDatabase roomDatabase;
LiveData<List<Log>> logData;
LogVM(Application application){
super(application);
roomDatabase=MasterDatabase.getInstance(application);
logData=roomDatabase.getLogDao.getAllLogs();
}
public LiveData<List<Log>> getLogData() {
return logData;
}
}
上面的代码实际上工作正常。但是我的问题是在构造函数中初始化logdata的时候,我们不是在主线程上运行数据库操作吗?但是代码编译并运行没有任何警告。有人可以解释一下吗?对不起,如果这是一个愚蠢的问题。但我只是一个初学者!
解决方案
Room 将为您创建代码,以确保当您的数据库代码被执行时,它被安排在后台线程上。如果您查看生成的代码,您会发现 DAO 类使用一个名为的内部类,该类ComputableLiveData
使用IOThreadExecutor
来执行其工作。
文档中有对此的简要描述。 https://developer.android.com/topic/libraries/architecture/livedata
Room 持久性库支持可观察的查询,这些查询返回 LiveData 对象。可观察查询是作为数据库访问对象 (DAO) 的一部分编写的。
Room 会在更新数据库时生成更新 LiveData 对象所需的所有代码。生成的代码在需要时在后台线程上异步运行查询。此模式对于保持 UI 中显示的数据与存储在数据库中的数据同步很有用。您可以在 Room 持久库指南中阅读有关 Room 和 DAO 的更多信息。
推荐阅读
- laravel - 如何保护路线 laravel-5.8
- c - 如果 c 中的结构未按预期方式工作,则嵌套
- python-3.x - 如何识别可被 5 整除到 40 的所有奇数,并保存在列表中
- bash - 如何使用`gnome-terminal`打开一个新的终端窗口并在其中执行命令?
- list - 为什么这个递归映射函数只应用于列表中的最后两个元素?
- http - HTTP 代码需要说明
- ios - SwiftUI - SF 符号不渲染
- html - Vue材料组件md-select所需的属性不起作用
- vue.js - 客户端用户可以更改 Vuex 的 Nuxt 状态吗?
- amazon-web-services - 我可以将多少个公共 IP 地址附加到 AWS 实例?