- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
简而言之:当 Observe 处于 Activity 状态时,它会在我通知时正常工作,但是当我返回到上一个 fragment (我使用导航组件)并再次导航到当前 fragment 时,会创建 fragment ,并且出于某种原因调用了 Observe。
为什么返回时Observe没有被删除?它应该根据 fragment 的生命周期行事。我尝试在 onStop 上删除,但仍然调用了 observe。
更多细节:我的每个项目 fragment 都分为3个部分:model、viewModel、view在 View 部分,我首先设置了 viewModel。
class EmergencyFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
emergencyFragmentViewModel = ViewModelProviders.of(this).get(EmergencyFragmentViewModel::class.java)
}
在 onViewCreated 中我设置了 Observer 对象,这样在 LiveData 中所做的任何更改我都会在此处收到更改通知:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
emergencyFragmentViewModel.isEmergencyEventMediaLDSuccess.observe(viewLifecycleOwner, Observer {
Log.d("sendEmergencyEvent", "isEmergencyEventMediaLDSuccess observer called")
}
})
}
在 ViewModel 类中,我将 LiveData 参数设置如下:
EmergencyFragmentViewModel: ViewModel() {
var isEmergencyEventMediaLDSuccess: LiveData<Boolean> = MutableLiveData()
private set
private val observerEventMedia = Observer<Boolean> { (isEmergencyEventMediaLDSuccess as MutableLiveData).value = it}
在初始化中我设置了一个观察者:
init {
EmergencyFragmentModel.isEmergencyEventMediaLDSuccessModel.observeForever(observerEventMedia)
}
当然在需要的时候删除
override fun onCleared() {
super.onCleared()
EmergencyFragmentModel.isEmergencyEventMediaLDSuccessModel.removeObserver(observerEventMedia)
}
模型部分定义如下:
class EmergencyFragmentModel {
companion object{
val isEmergencyEventMediaLDSuccessModel: LiveData<Boolean> = MutableLiveData()
我确实请求网络,当回复返回时我执行通知
override fun onResponse(call: Call<Int>, response: Response<Int>) {
if(response.isSuccessful) {
(isEmergencyEventLDModelSuccess as MutableLiveData).postValue(true)
Log.d("succeed", "sendEmergencyEvent success: ${response.body().toString()}")
}
谁能说出我错过了什么?为什么当有一个 Activity 的 Observe 并且我返回到上一个 fragment (我使用导航组件)并再次导航到当前 fragment 时,Observe 被调用?我可以理解,当创建 ViewModel 实例并为 LiveData 参数执行 setValue 时,它会收到通知。但是为什么我回去的时候观察没有被移除?我尝试删除 onStop 上的 Observe,但它一直在发生。
override fun onStop() {
super.onStop()
emergencyFragmentViewModel.isEmergencyEventMediaLDSuccess.removeObservers(viewLifecycleOwner)
emergencyFragmentViewModel.isEmergencyEventMediaLDSuccess.removeObserver(observeEmergencyEventLDSuccess)
}
最佳答案
@Pawel 是对的。 LiveData 存储该值,并且每次您观察它时(在本例中是在您的 onViewCreated 中),它都会发出最后存储的值。
也许你想要像 SingleLiveEvent 这样的东西,在有人阅读后清除它的值(value)。
所以当你来回移动时,它不会发出最后一个值(一旦它被清理)。
关于android - 观察 onCreate fragment 时调用的 LiveData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59239874/
我是一名优秀的程序员,十分优秀!