每次回到片段时都会调用 livedata 观察器
livedata observer called each time when back on fragment
我有fragment1,我从那里转到fragment2。
问题是我无法从 fragment2 返回到 fragment1
这就是我处理按钮点击的方式
val onClickLiveData = MutableLiveData<OnClick>()
fun onClick() {
onClickLiveData.value = OnClick.CLICK
}
这就是我处理到 fragment2 的转换方式
private fun subscribeToClickCallbacks() {
viewModel.onClickLiveData.observe(viewLifecycleOwner, Observer {
findNavController().navigate(R.id.action_home_fragment_to_repositories_fragment)
})
}
我是这样处理转换回来的
navController.popBackStack()
在调试的帮助下,我发现每次转换到 fragment1 时,都会调用 livedata 并立即打开 fragment2。
问题如何解决?我将不胜感激。
如果实时数据多次被观察者使用SingleEvent来处理这种情况。
像这样为 SingleLiveData 创建一个全局 class。
class SingleLiveEvent<T> : MutableLiveData<T>() {
private val mPending = AtomicBoolean(false)
@MainThread
override fun observe(owner: LifecycleOwner, observer: Observer<T>) {
if (hasActiveObservers()) {
Log.w(TAG, "Multiple observers registered but only one will be notified of changes.")
}
// Observe the internal MutableLiveData
super.observe(owner, object : Observer<T> {
override fun onChanged(t: T?) {
if (mPending.compareAndSet(true, false)) {
observer.onChanged(t)
}
}
})
}
@MainThread
override fun setValue(t: T?) {
mPending.set(true)
super.setValue(t)
}
/**
* Used for cases where T is Void, to make calls cleaner.
*/
@MainThread
fun call() {
setValue(null)
}
companion object {
private val TAG = "SingleLiveEvent"
}
}
现在这样使用class,
val onClickLiveData = SingleLiveEvent<OnClick>()
我有fragment1,我从那里转到fragment2。 问题是我无法从 fragment2 返回到 fragment1 这就是我处理按钮点击的方式
val onClickLiveData = MutableLiveData<OnClick>()
fun onClick() {
onClickLiveData.value = OnClick.CLICK
}
这就是我处理到 fragment2 的转换方式
private fun subscribeToClickCallbacks() {
viewModel.onClickLiveData.observe(viewLifecycleOwner, Observer {
findNavController().navigate(R.id.action_home_fragment_to_repositories_fragment)
})
}
我是这样处理转换回来的
navController.popBackStack()
在调试的帮助下,我发现每次转换到 fragment1 时,都会调用 livedata 并立即打开 fragment2。
问题如何解决?我将不胜感激。
如果实时数据多次被观察者使用SingleEvent来处理这种情况。 像这样为 SingleLiveData 创建一个全局 class。
class SingleLiveEvent<T> : MutableLiveData<T>() {
private val mPending = AtomicBoolean(false)
@MainThread
override fun observe(owner: LifecycleOwner, observer: Observer<T>) {
if (hasActiveObservers()) {
Log.w(TAG, "Multiple observers registered but only one will be notified of changes.")
}
// Observe the internal MutableLiveData
super.observe(owner, object : Observer<T> {
override fun onChanged(t: T?) {
if (mPending.compareAndSet(true, false)) {
observer.onChanged(t)
}
}
})
}
@MainThread
override fun setValue(t: T?) {
mPending.set(true)
super.setValue(t)
}
/**
* Used for cases where T is Void, to make calls cleaner.
*/
@MainThread
fun call() {
setValue(null)
}
companion object {
private val TAG = "SingleLiveEvent"
}
}
现在这样使用class,
val onClickLiveData = SingleLiveEvent<OnClick>()