ViewModel:检查片段是恢复还是停止
ViewModel: Check if fragment is resume or stop
我在 ViewModel
中执行网络操作,使用 RxJava 以 10 seconds
的间隔重复获取。但是,当我的片段在屏幕上不可见时,我不想从这个 API 获取数据,例如当我在它的顶部打开一个 Activity 时,我将有一个代码 if(!isResume) return
.我的问题是,使用 MutableLiveData<Boolean>
是否可以,其中值将在 onResume
和 onPause
中更新,所以如果不恢复我可以忽略网络请求或者它是否违反概念MVVM
?我们可以这样做,但不确定是否可以这样做。
您可以让 ViewModel
实现接口 DefaultLifecycleObserver
(https://developer.android.com/reference/androidx/lifecycle/DefaultLifecycleObserver),然后覆盖方法 onResume
和 onPause
。更新内部布尔变量,例如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] 中管理订阅=].
希望有解决方案:
- 使用 RxJava 实现而不是
LiveData
s,当没有订阅者时停止执行,在 onPause
中手动删除订阅者
- ** 使用 Kotlin Flows,阅读 this article。您可以使用
SharingStarted.WhileSubscribed
公开 Flow
,并使用 收集它
flowWithLifecycle(lifecycleOwner, Lifecycle.State.RESUMED)
我在 ViewModel
中执行网络操作,使用 RxJava 以 10 seconds
的间隔重复获取。但是,当我的片段在屏幕上不可见时,我不想从这个 API 获取数据,例如当我在它的顶部打开一个 Activity 时,我将有一个代码 if(!isResume) return
.我的问题是,使用 MutableLiveData<Boolean>
是否可以,其中值将在 onResume
和 onPause
中更新,所以如果不恢复我可以忽略网络请求或者它是否违反概念MVVM
?我们可以这样做,但不确定是否可以这样做。
您可以让 ViewModel
实现接口 DefaultLifecycleObserver
(https://developer.android.com/reference/androidx/lifecycle/DefaultLifecycleObserver),然后覆盖方法 onResume
和 onPause
。更新内部布尔变量,例如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] 中管理订阅=]. 希望有解决方案:
- 使用 RxJava 实现而不是
LiveData
s,当没有订阅者时停止执行,在onPause
中手动删除订阅者
- ** 使用 Kotlin Flows,阅读 this article。您可以使用
SharingStarted.WhileSubscribed
公开Flow
,并使用 收集它
flowWithLifecycle(lifecycleOwner, Lifecycle.State.RESUMED)