ViewModel:检查片段是恢复还是停止

ViewModel: Check if fragment is resume or stop

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

您可以让 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 知道 View 的生命周期,因为我认为这在概念上是错误的。如果您的 ViewModel 在某个时刻被多个 View 共享,哪一个会停止抓取?

在这种情况下,您需要一个逻辑,它与 订阅者数量 相关联,并在您的 View[=30] 中管理订阅=]. 希望有解决方案:

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