【问题标题】:Avoid Duplicate Network Call Using Android-ViewModel (M-V-VM)使用 Android-ViewModel (M-V-VM) 避免重复网络调用
【发布时间】:2019-07-18 13:11:13
【问题描述】:

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

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

,是否还有其他方法可以识别以避免不必要的网络调用

【问题讨论】:

    标签: android mvvm android-viewmodel


    【解决方案1】:

    您可以在ViewModel 的init 中调用您的方法。

    class YourViewModel() : ViewModel() {
    
        init {
            getBooksFromSource()  
        }
    }
    

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

    【讨论】:

    • 是的,这行得通。但是,如果同一个视图模型被多个活动共享,那么就没有必要调用其他活动了。
    • 如果活动的需求不同,你应该把你的ViewModel的逻辑拆分成两个不同的ViewModel。
    【解决方案2】:
    livedata = Livedata<Object> //class member
    getBooksFromSource(){
     if(livedata !=null){
       // call network 
    }else{
      // do nothing.
    }
    return livedata
    

    }

    如果instance为null,这只会调用一次,这只是第一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 2010-09-25
      • 1970-01-01
      • 2015-12-05
      • 2021-05-16
      • 2022-08-09
      • 1970-01-01
      相关资源
      最近更新 更多