【问题标题】:LiveData observer fired multiple in fragmentLiveData 观察者在片段中多次触发
【发布时间】:2021-01-16 13:16:20
【问题描述】:

我试图在fragment 中实现登录功能。以下是代码:

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    MainViewModel mainViewModel = new ViewModelProvider(requireActivity()).get(MainViewModel.class);
    String email = ....;
    String password = ....;
    SignInLiveData signInStatusObserver = mainViewModel.getSignInStatusLiveData(email, password);
    signInStatusObserver.observe(getViewLifeCycleOwer(), new Observer<Boolean>{
            @Override
            public void onChanged(Boolean isSignedIn) {
                if(isSignedIn)
                    Toast.makeText(requireContext(), "SignIn Successful", Toast.LENGTH_LONG).show();
                else
                    Toast.makeText(requireContext(), "SignIn Unsuccessful", Toast.LENGTH_LONG).show();
            }
    }
}

它工作正常,但是当我锁定手机然后解锁时(使用屏幕上的应用程序),Toast 消息再次显示。 再次,当我锁定然后解锁设备(任意次数)时,吐司会一次又一次地显示。

为什么会这样?
如何只显示一次吐司?

【问题讨论】:

  • 好像你在onResume 方法中调用了一些方法来操作实时数据值。你能添加那个片段的代码吗
  • onResume() 方法中没有任何代码。

标签: android android-fragments android-livedata android-mvvm


【解决方案1】:

我相信你的情况是这样的:

  1. 你锁定了你的设备 -> 在某些时候片段的视图被破坏了(视图模型不是)
  2. 您解锁设备并返回应用程序 -> 您的片段获取新视图,尝试观察实时数据(请记住视图模型与 p1 中的相同)-> 事件被发出。

如何处理:为了简短起见,请查看这里https://medium.com/androiddevelopers/livedata-with-snackbar-navigation-and-other-events-the-singleliveevent-case-ac2622673150(我不是作者)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多