【问题标题】:ViewModel: Check if fragment is resume or stopViewModel:检查片段是恢复还是停止
【发布时间】:2021-07-18 07:08:20
【问题描述】:

我在ViewModel 中执行网络内容,使用 RxJava 以10 seconds 的间隔重复其获取。但是,当我的 Fragment 在屏幕上不可见时,我不想从此 API 获取数据,例如当我在其顶部打开一个 Activity 时,我将有一个类似 if(!isResume) return 的代码。我的问题是,是否可以使用MutableLiveData<Boolean>,其中的值将在onResumeonPause 中更新,所以如果不恢复,我可以忽略网络请求,还是违反MVVM 的概念?我们可以这样做,但不确定是否可以这样做。

【问题讨论】:

  • 只需扩展您的LiveData 并挂钩到onActiveonInactive 方法。这就是我所做的,它符合 MVVM。

标签: android mvvm rx-java2 android-livedata android-viewmodel


【解决方案1】:

您可以让您的ViewModel 实现接口DefaultLifecycleObserver (https://developer.android.com/reference/androidx/lifecycle/DefaultLifecycleObserver),然后覆盖方法onResumeonPause。更新内部布尔变量,例如isResumed,当这些方法被调用时,如果相应的片段处于恢复状态,您将能够检查其他方法。

class YourViewModel : DefaultLifecycleObserver {
    private var isResumed = false

    override fun onResume(owner: LifecycleOwner) {
        isResumed = true
    }

    override fun onPause(owner: LifecycleOwner) {
        isResumed = false
    }
}

您还需要更新您的 Fragment 代码以将 ViewModel 添加为生命周期观察者:

class YourFragment : Fragment() {
    private val viewModel: YourViewModel // initialize it

    override fun onViewCreated(...) {
        lifecycle.addObserver(viewModel)
    }
}

【讨论】:

  • 我以前见过这样的答案,但这样做是否安全,或者它破坏了 ViewModel 的概念?
  • 使用它而不是仅仅从 Fragment 更改 onResumeonPause 中的 MutableLiveData 值有什么好处?
  • 优点是您无需从 Fragment 方面担心这一点。您只需让 ViewModel 查询 Fragment 的生命周期并执行其操作即可。
  • 当您从 Fragment 端调用 LiveData 上的“observe”方法时,您指定一个 LifecycleOwner(例如“viewLifecycleOwner”)作为参数。该参数控制观察者何时停止收听;换句话说,当它注意到 Fragment 不再可见时,它会“注销”自己。
【解决方案2】:

我不希望我的ViewModel 知道View 的生命周期,因为我认为它在概念上是错误的。如果您的ViewModel 在某个时候在多个Views 之间共享,哪一个会停止获取?

在这种情况下,您需要一个与订阅者数量相关联的逻辑,并在您的视图中管理订阅。 希望有解决方案:

  1. 使用RxJava实现代替LiveDatas,当没有订阅者时停止执行,在onPause中手动移除订阅者
  2. ** 使用 Kotlin 流,请阅读 this article。您可以使用SharingStarted.WhileSubscribed 公开Flow 并收集它
flowWithLifecycle(lifecycleOwner, Lifecycle.State.RESUMED)

【讨论】:

  • 关于#1,您的意思是使用 Disposal?如果是,我会使用它,但我想知道 Fragment 是否可见,因为我的 Observable 具有获取数据的间隔。
  • 我不依赖任何视图生命周期或上下文,我只想让我的 ViewModel 知道 Fragment 是否恢复,以避免不必要的从间隔获取。
猜你喜欢
  • 2019-07-11
  • 2013-08-27
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
相关资源
最近更新 更多