为了账号安全,请及时绑定邮箱和手机立即绑定

AsyncTask,AsynTaskLoader还是Executer with ViewModel

AsyncTask,AsynTaskLoader还是Executer with ViewModel

墨色风雨 2022-08-03 16:17:09
首先,我不知道Android和Java中的所有内容,我正在研究这个问题,以防你在我的问题中发现缺乏知识。当我读到加载程序的好处时,我读到加载程序在单独的线程上运行,以防止UI无响应。在出现并阅读了ViewModel,LiveData和Room以及阅读了这篇文章之后,特别是在“观察数据”部分,其中说在世界上,将数据传输到UI将涉及在正确的位置调用,并构建>?。在架构组件世界中,世界更加简单。等。。LoaderLoaderManagerinitLoader()LoaderCallbacks和下一节加载第二段中所说的所有内容例如,Room 允许您拥有可观察的查询 — 返回的数据库查询,以便数据库更改自动通过您的 UI 向上传播。有点像没有触摸光标或加载器。LiveDataViewModelCursorLoader以上所有内容都意味着ViewModel和LiveData with Room可以在后台线程中工作,我的意思是当我们使用ViewModel和LiveData与Room而不是Loaders时,我们不需要使用AsyncTask或AsyncTaskLoader或Executer。但在这些例子中:带有视图的机器人房间,可以用作模板,正如他们在 README.md 中所说的那样,在MainActivity中.java他们写,如果我们深入跟踪,我们发现该函数是select的查询,但是当他们想要在WordRepository.java或WordRoomDatabase中插入数据时.java他们使用AsyncTask,mWordViewModel.getAllWords().observe(this, .... ;getAllWords()我的意思是为什么他们使用ViewModel,LiveData和Dao来查询select,并且在插入的查询中,他们包含了带有ViewModel和Dao的AsyncTask?,因为正如上面所暗示的那样,ViewModel和LiveData with Room可以在后台线程中工作?我之前的问题适用于此示例 android-persistence at step3_solution,我的意思是只获取使用 ViewModel 的数据,但要像在 DatabaseInitializer 中一样插入数据.java,AsyncTask 是否包括在内?同样在这个 BasicSample 示例中,当必须插入数据时,将包含执行程序?
查看完整描述

2 回答

?
慕运维8079593

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 的查询将跟踪基础数据库的失效情况,如果您执行了会更改此表的写入操作,则会为您重新查询结果集。这样,在执行更改特定表中元素的写入操作时,就无需手动查询数据库。实际上,这非常方便。

插入物只是插入物。所以在这种情况下,他们不会为你做魔术。


查看完整回答
反对 回复 2022-08-03
?
慕妹3146593

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 指南。


查看完整回答
反对 回复 2022-08-03
  • 2 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信