我們使用 ViewModels 來存盤和操作將由 Activity/Fragment 中的 Views 使用的資料——因為 ViewModel 中的資料在配置更改后仍然存在,這有助于我們保留 UI 狀態。這是我們在 ViewModel 中進行網路呼叫操作的原因之一,但是我們在 ViewModel 中進行網路呼叫操作還有其他原因嗎?
我在某處讀到,如果我們在 ViewModels 中進行網路呼叫,呼叫不會在配置更改時再次發生?但我很確定 API 呼叫在我的 Fragment 中再次發生改變設備方向。
uj5u.com熱心網友回復:
為了克服這個問題,您可以在 viewmodel makeApiCall() 的 init 方法中呼叫您的函式,以防止由于 onViewCreated 方法而導致第二次呼叫。您可以將 api 結果存盤到 livedata 中。
或者,您也可以像這樣使用 LiveData 范圍:
val makeApiCall: () -> LiveData<List<Data>> = {
liveData {
emit(repository.fetchData()) // API call
}
}
從您的 onViewCreated 呼叫 makeApiCall lambda 函式,現在 API 呼叫將只發出一次,并且您的實時資料將在 onViewCreated 中被觀察到。
這是 viewmodel 防止 API 呼叫方向變化的主要優勢之一。
另一個優點是,假設如果您關閉螢屏并且現在不再需要 API 呼叫,那么如果您使用 RxJava,則需要取消/處置 API 呼叫以釋放資源,以便您可以在 viewModel 的 onCleared 方法中執行它,而不管方向變化.
或者,如果您正在使用協程,您可以使用 LiveData 范圍和 viewModel 范圍,而無需關心取消協程。它是由自己管理的。
uj5u.com熱心網友回復:
根據我的做法,我們在 viewModel 中保留 api 是因為以下原因 1)它減少了 Android 組件和非 Android 組件之間的耦合 2)您也可以在其他螢屏上重用相同的 ViewModel 3)在獲取資料后存盤該資料在你的 liveData 持有者中,它可以在你的 UI 中使用資料來改變它的配置,而不會造成 api 命中
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/507356.html