猿问

AsyncTask,AsynTaskLoader还是Executer with ViewModel

首先,我不知道Android和Java中的所有内容,我正在研究这个问题,以防你在我的问题中发现缺乏知识。

当我读到加载程序的好处时,我读到加载程序在单独的线程上运行,以防止UI无响应。

在出现并阅读了ViewModelLiveDataRoom以及阅读了这篇文章之后,特别是在“观察数据”部分,其中说

在世界上,将数据传输到UI将涉及在正确的位置调用,并构建>?。在架构组件世界中,世界更加简单。等。。LoaderLoaderManagerinitLoader()LoaderCallbacks

和下一节

加载第二段中所说的所有内容

例如,Room 允许您拥有可观察的查询 — 返回的数据库查询,以便数据库更改自动通过您的 UI 向上传播。有点像没有触摸光标或加载器。LiveDataViewModelCursorLoader

以上所有内容都意味着ViewModelLiveData with Room可以在后台线程中工作,我的意思是当我们使用ViewModelLiveDataRoom而不是Loaders时,我们不需要使用AsyncTaskAsyncTaskLoaderExecuter。

但在这些例子中:

带有视图的机器人房间,可以用作模板,正如他们在 README.md 中所说的那样,

MainActivity中.java他们写,如果我们深入跟踪,我们发现该函数是select的查询,但是当他们想要在WordRepository.javaWordRoomDatabase插入数据时.java他们使用AsyncTaskmWordViewModel.getAllWords().observe(this, .... ;getAllWords()

我的意思是为什么他们使用ViewModelLiveDataDao来查询select,并且在插入的查询中,他们包含了带有ViewModelDaoAsyncTask?,因为正如上面所暗示的那样,ViewModelLiveData with Room可以在后台线程中工作?

我之前的问题适用于此示例 android-persistence at step3_solution,我的意思是只获取使用 ViewModel 的数据,但要像在 DatabaseInitializer 中一样插入数据.java,AsyncTask 是否包括在内?

同样在这个 BasicSample 示例中,当必须插入数据时,将包含执行程序


墨色风雨
浏览 115回答 2
2回答

慕运维8079593

在MainActivity中.java他们编写mWordViewModel.getAllWords().observe(this, .... ; 如果我们深入跟踪getAllWords(),我们发现该函数是select的查询,实际上,从 Room DAO 公开为 ,因此可以观察到它,并且在内部 Room 将处理异步提取任务(执行的是双线程执行器)。getAllWords()LiveData<List<T>>ArchTaskExecutor.io()@Query("SELECT&nbsp;*&nbsp;from&nbsp;word_table&nbsp;ORDER&nbsp;BY&nbsp;word&nbsp;ASC") LiveData<List<Word>>&nbsp;getAlphabetizedWords();但是,如果您有一个 ,则在 Room DAO 上,这是同步方法,因此它们不会为您处理线程。insertAsyncTask 是一种在 Android 的默认执行器(读取:后台线程)上执行代码的一种特殊方法,用于后台任务:public&nbsp;static&nbsp;final&nbsp;Executor&nbsp;SERIAL_EXECUTOR&nbsp;=&nbsp;new&nbsp;SerialExecutor(); private&nbsp;static&nbsp;volatile&nbsp;Executor&nbsp;sDefaultExecutor&nbsp;=&nbsp;SERIAL_EXECUTOR;它按顺序运行每个任务。因此,您的问题的答案是,因为查询和插入的工作方式不同。显示为 LiveData 的查询将跟踪基础数据库的失效情况,如果您执行了会更改此表的写入操作,则会为您重新查询结果集。这样,在执行更改特定表中元素的写入操作时,就无需手动查询数据库。实际上,这非常方便。插入物只是插入物。所以在这种情况下,他们不会为你做魔术。

慕妹3146593

以上所有内容都意味着ViewModel和LiveData with Room可以在后台线程中工作,我的意思是当我们使用ViewModel和LiveData与Room而不是Loaders时,我们不需要使用AsyncTask或AsyncTaskLoader或Executer。他们没有。它们在执行的当前线程上运行。这就是为什么在你引用的示例中,他们仍然使用AsyncTask将工作移动到后台线程的原因。另请注意,可变实时数据有两种方法来设置其值。public void postValue(T value) {&nbsp; &nbsp; super.postValue(value);}public void setValue(T value) {&nbsp; &nbsp; 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 指南。
随时随地看视频慕课网APP

相关分类

Java
我要回答