假设有一个活动“ A”。在onCreate()
方法中的活动'A'中,您正在初始化ViewModel,然后在vmInstance.getBooksFromSource()
中仅使用onCreate()
之类的viewmodel进行网络调用。现在假设我的网络呼叫响应已经到来,同时用户将旋转屏幕,并再次触发活动'A'onCreate()
方法,我们将获得相同的旧viewmodel实例,但是我的vmInstance.getBooksFromSource()
将再次获得触发。因此,如果我已经收到响应,那么现在我想删除不必要的呼叫,因此不要再次访问服务器。
现在,我正在活动中维护本地布尔标志(默认情况下其值为false),如果我从服务器获取响应并将其值保存在onSavedInstanceState()
上,则启用它。然后在onCreate()
方法内部,我检查它的值(通过bundle检查)是否为假,那么只有我在进行网络调用。如果数据已经来自vmInstance.getBooksFromSource()
答案 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时才调用一次。