首页 > 解决方案 > 在 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的时候,我们不是在主线程上运行数据库操作吗?但是代码编译并运行没有任何警告。有人可以解释一下吗?对不起,如果这是一个愚蠢的问题。但我只是一个初学者!

标签: viewmodelandroid-roomandroid-livedata

解决方案


Room 将为您创建代码,以确保当您的数据库代码被执行时,它被安排在后台线程上。如果您查看生成的代码,您会发现 DAO 类使用一个名为的内部类,该类ComputableLiveData使用IOThreadExecutor来执行其工作。

文档中有对此的简要描述。 https://developer.android.com/topic/libraries/architecture/livedata

Room 持久性库支持可观察的查询,这些查询返回 LiveData 对象。可观察查询是作为数据库访问对象 (DAO) 的一部分编写的。

Room 会在更新数据库时生成更新 LiveData 对象所需的所有代码。生成的代码在需要时在后台线程上异步运行查询。此模式对于保持 UI 中显示的数据与存储在数据库中的数据同步很有用。您可以在 Room 持久库指南中阅读有关 Room 和 DAO 的更多信息。


推荐阅读