redroundian 2024-03-28 21:31 采纳率: 94.4%
浏览 7
已结题

Livedata中数值更新问题

        //livedata监听gyro数据的变化
        viewModel.getGyro().observe((LifecycleOwner) getActivity(), new Observer<float[]>() {
            @Override
            public void onChanged(float[] array) {
                if((System.currentTimeMillis()-viewModel.getTexttimeg().getValue())>200)
                {
                    gyro.setText("X: " + Float.toString(array[0])+"\n"+"Y: " + Float.toString(array[1])+"\n"+"Z: " + Float.toString(array[2]));
                    viewModel.updatetexttimeg(System.currentTimeMillis());
                }

            }
        });

该程序在fragment类中,初始化界面时使用该fragment,程序运行正常。但退出重进该fragment之后,程序运行出来if条件一直被判断为false,但if语句中的viewModel.updatetexttimeg(System.currentTimeMillis());执行了,而第一句settext却没有执行。只是为什么?按理说if不应该一直判断为false呀,而且texttimeg只在if为true时执行,但false的时候为什么也执行呀?既然执行了viewModel.updatetexttimeg(),那它的前一句为什么又不执行呢?

  • 写回答

4条回答 默认 最新

  • 关注

    redroundian 晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    在观察LiveData数据变化时,确保正确更新UI的问题常常是由于生命周期导致的。在退出并重新进入该Fragment后,LiveData对象会重新订阅,可能会导致观察者的回调方法被调用多次。 下面是针对你的问题提供的解决方案:

    1. 确保LiveData的观察者在适当的时候被移除:在Fragment的onDestroyView()方法中,你可以调用removeObservers()方法来移除LiveData的观察者。这样做可以防止重复观察LiveData并导致回调方法被多次调用。

    2. 添加日志输出:在回调方法的开头和结尾处添加日志输出,以便查看回调方法是否被调用多次。

    下面是示例代码,展示了如何应用上述解决方案:

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        viewModel.getGyro().removeObservers(getViewLifecycleOwner());
    }
    
    viewModel.getGyro().observe(getViewLifecycleOwner(), new Observer<float[]>() {
        @Override
        public void onChanged(float[] array) {
            Log.d("LiveData", "Observer onChanged() called"); // 添加日志输出
    
            if ((System.currentTimeMillis() - viewModel.getTexttimeg().getValue()) > 200) {
                gyro.setText("X: " + Float.toString(array[0]) + "\n" + "Y: " + Float.toString(array[1]) + "\n" + "Z: " + Float.toString(array[2]));
                viewModel.updatetexttimeg(System.currentTimeMillis());
            }
    
            Log.d("LiveData", "Observer onChanged() finished"); // 添加日志输出
        }
    });
    

    通过添加这些日志输出,你可以检查LiveData的观察者被调用的次数,并确定在何时以及为何没有正确更新UI。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月14日
  • 已采纳回答 4月6日
  • 创建了问题 3月28日

悬赏问题

  • ¥15 vb6.0调用ImageMagick进行图片转换问题
  • ¥15 安卓组件化工程引入Arouter报错there's no route matched path[/login/LoginActivity,如何解决?
  • ¥50 如何进行点云姿态调整优化
  • ¥20 关于c++的问题 如何用qt完成
  • ¥15 台达变频器MS300与伺服驱动器B3系列的抱闸与电路设计如何实现
  • ¥20 C++通过HICON获取argb像素数组
  • ¥15 如何利用支持向量机提高分类器正确率和筛选理想分类器
  • ¥15 Pygame坦克大战游戏开发实验报告
  • ¥15 用vmmare虚拟机用sentaurus仿真的时候,调用terminal程序,输入swb指令弹出这个,打不开workbench,桌面上面的sentaurus workbench也打不开
  • ¥75 使用winspool.drv的SetPrinter设置打印机失败