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 指南。
添加回答
舉報