2 回答
TA贡献1876条经验 获得超5个赞
在MainActivity中.java他们编写mWordViewModel.getAllWords().observe(this, .... ; 如果我们深入跟踪getAllWords(),我们发现该函数是select的查询,
实际上,从 Room DAO 公开为 ,因此可以观察到它,并且在内部 Room 将处理异步提取任务(执行的是双线程执行器)。getAllWords()
LiveData<List<T>>
ArchTaskExecutor.io()
@Query("SELECT * from word_table ORDER BY word ASC") LiveData<List<Word>> getAlphabetizedWords();
但是,如果您有一个 ,则在 Room DAO 上,这是同步方法,因此它们不会为您处理线程。insert
AsyncTask 是一种在 Android 的默认执行器(读取:后台线程)上执行代码的一种特殊方法,用于后台任务:
public static final Executor SERIAL_EXECUTOR = new SerialExecutor(); private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR;
它按顺序运行每个任务。
因此,您的问题的答案是,因为查询和插入的工作方式不同。
显示为 LiveData 的查询将跟踪基础数据库的失效情况,如果您执行了会更改此表的写入操作,则会为您重新查询结果集。这样,在执行更改特定表中元素的写入操作时,就无需手动查询数据库。实际上,这非常方便。
插入物只是插入物。所以在这种情况下,他们不会为你做魔术。
TA贡献1820条经验 获得超9个赞
以上所有内容都意味着ViewModel和LiveData with Room可以在后台线程中工作,我的意思是当我们使用ViewModel和LiveData与Room而不是Loaders时,我们不需要使用AsyncTask或AsyncTaskLoader或Executer。
他们没有。它们在执行的当前线程上运行。这就是为什么在你引用的示例中,他们仍然使用AsyncTask将工作移动到后台线程的原因。
另请注意,可变实时数据有两种方法来设置其值。
public void postValue(T value) {
super.postValue(value);
}
public void setValue(T value) {
super.setValue(value);
}
postValue(value)用于在后台线程中设置 when 的值。如果我没记错的话,在后台调用 while 会引发异常。MutableLiveDatasetValue(value)
此外,加载程序从 API 28 开始被弃用。你可以在这里阅读。
加载器从Android P(API 28)开始被弃用。在处理活动和片段生命周期时处理加载数据的建议选项是使用 ViewModels 和 LiveData 的组合。ViewModels可以像Loaders一样承受配置更改,但样板更少。LiveData 提供了一种生命周期感知的加载数据的方法,您可以在多个 ViewModels 中重用这些数据。您还可以使用 MediatorLiveData 组合 LiveData,并且可以使用任何可观察的查询(例如来自 Room 数据库的查询)来观察对数据的更改。ViewModels 和 LiveData 在您无权访问 LoaderManager 的情况下(例如在服务中)也可用。结合使用这两者提供了一种简单的方法来访问应用所需的数据,而无需处理 UI 生命周期。要了解有关 LiveData 的更多信息,请参阅 LiveData 指南,要了解有关 ViewModels 的更多信息,请参阅 ViewModel 指南。
添加回答
举报