简而言之:当Observe处于活动状态时,当我发出通知时它可以正常工作,但是当我返回上一个片段(我使用导航组件)并再次导航到当前片段时,就会创建一个片段,并出于某种原因调用了Observe。
为什么回退时不删除观察?它应根据片段的生命周期运行。 我尝试在onStop上删除,但观察值仍然被调用。
更多详细信息: 我的每个项目片段都分为3部分:模型,viewModel,视图 在视图部分,我首先设置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()}")
}
有人可以说我想念的吗?为什么当有活动的观察者并且我回到上一个片段(我使用导航组件)并再次导航到当前片段时,调用了观察者?我可以理解,当创建ViewModel实例并为LiveData参数执行setValue时,便会收到通知。但是,为什么我回去时观察物没有移走?我尝试在onStop上删除Observe,并且这种情况一直在发生。
override fun onStop() {
super.onStop()
emergencyFragmentViewModel.isEmergencyEventMediaLDSuccess.removeObservers(viewLifecycleOwner)
emergencyFragmentViewModel.isEmergencyEventMediaLDSuccess.removeObserver(observeEmergencyEventLDSuccess)
}
答案 0 :(得分:0)
@Pawel是正确的。 LiveData会存储该值,并且每次您观察它时(在这种情况下,在onViewCreated中),它将发出存储的最后一个值。
也许您想要类似SingleLiveEvent之类的东西,它会在有人读取后清除其值。
因此,当您来回移动时,它不会发出最后一个值(一旦它被清除)。