避免使用Android-ViewModel(M-V-VM)重复网络通话

时间:2019-07-18 13:11:13

标签: android mvvm android-viewmodel

假设有一个活动“ A”。在onCreate()方法中的活动'A'中,您正在初始化ViewModel,然后在vmInstance.getBooksFromSource()中仅使用onCreate()之类的viewmodel进行网络调用。现在假设我的网络呼叫响应已经到来,同时用户将旋转屏幕,并再次触发活动'A'onCreate()方法,我们将获得相同的旧viewmodel实例,但是我的vmInstance.getBooksFromSource()将再次获得触发。因此,如果我已经收到响应,那么现在我想删除不必要的呼叫,因此不要再次访问服务器。

现在,我正在活动中维护本地布尔标志(默认情况下其值为false),如果我从服务器获取响应并将其值保存在onSavedInstanceState()上,则启用它。然后在onCreate()方法内部,我检查它的值(通过bundle检查)是否为假,那么只有我在进行网络调用。如果数据已经来自vmInstance.getBooksFromSource()

的viewodel方法,还有其他方法可以识别以避免不必要的网络呼叫

3 个答案:

答案 0 :(得分:1)

您可以在init的{​​{1}}内部调用方法。

ViewModel

您的ViewModel将在配置更改后保留其实例,并且不会重新创建它。将方法放置在init块中将防止多次调用它们,因为一旦创建ViewModel,它只会被调用一次。

答案 1 :(得分:0)

为了使您更好地理解,旋转设备不会重新创建ViewModel https://developer.android.com/topic/libraries/architecture/viewmodel

基于@Jaime Suarez的回答,我同意您应该在ViewModel的init中进行调用,以便在创建ViewModel时仅执行一次。如果您担心在重用ViewModel时再次执行相同的调用,请创建另一个ViewModel或考虑将该调用的结果缓存

答案 2 :(得分:0)

livedata = Livedata<Object> //class member
getBooksFromSource(){
 if(livedata !=null){
   // call network 
}else{
  // do nothing.
}
return livedata

}

仅当实例为null时才调用一次。