亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號