android 更新了TextView 的值ui没更新是为什么?

问题是: 主线程中通过 setText 更新了 TextView,但是视图没有更新这是为什么?而且仅在app运行一段时间后开始不更新,一开始运行的时候都能正常更新。

详情如下:

1FJ2RN_ZPXSGC9%~2%}14FT.png
image.png
用的 BottomNavigationView 包做的地步导航菜单
R3W7Y[Y9YB6CRC7`_%UQ3UK.png
当 ws 接收到刷新未读消息数量的时候会用 EventBus 推送一条更新数量的消息
image.png
在具体的页面中做了 eventbus 的监听,也能正常收到 eventbus 的消息
C1IO5S$K0)@YCL_X5M~LTR7.png
接收到消息,重新掉接口获取未读消息数量,并更新导航菜单的未读数量
IY0Z2ZZYBVP~9V_)(GG%9[S.png
上述是具体的更新代码,都有成功执行。但是页面就是死活没变化,我也有看线程,上述更新代码都是在主线程中执行的,就是不更新,而且很奇怪,一开始运行app的时候能正常更新数量,后面ws、eventbus 都正常的情况下,一段时间后,改了未读消息数量,改成功了,页面不更新。该如何解决?

阅读 2.2k
avatarAI BotBETA

Android 中,TextView 的值没有更新,即使你在主线程中调用了 setText 方法,可能有几个原因:

  1. UI刷新问题:Android 的 UI 更新不是实时的,它依赖于一个消息队列。如果你的代码执行得太快,或者在某些情况下,Android 系统可能不会立即处理 UI 刷新。尝试在 setText 之后使用 invalidate()requestLayout() 方法强制 UI 刷新。
  2. 视图重用问题:如果你在使用 ViewPagerRecyclerView 或其他可以重用视图的组件,并且视图被缓存和重用,那么你可能需要确保在每次视图被重新使用时都更新其数据。
  3. 线程问题:虽然你提到更新是在主线程上进行的,但还是要确保没有其他代码在后台线程中修改了 UI。Android 不允许在后台线程中直接修改 UI。
  4. 缓存问题:有时,视图或布局可能会被缓存,导致更新不会立即显示。尝试调用 findViewById 方法重新获取 TextView 的引用,并再次设置文本。
  5. 事件总线问题:EventBus 的事件处理可能存在问题。确保事件被正确发布和接收,并且接收事件的代码逻辑是正确的。
  6. 布局问题:检查你的布局文件,确保 TextView 的可见性和其他属性设置正确。
  7. 数据更新问题:确保你真正更新了用于显示的数据。有时,开发者可能错误地认为数据已经更新,但实际上并没有。

为了更准确地诊断问题,你可能需要提供更多的代码和上下文信息。不过,基于你提供的信息,你可以尝试上述建议,看看是否能解决你的问题。

2 个回答

主线程中可以正常更新 ui;是更新的视图错误导致。

不能在子线程中去更新UI,这是Android的UI渲染与维护策略。正确的姿势是:使用Hadler消息或主线程去更新UI;
你可以使用Handler:

Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
    @Override
    public void run() {
        // 在主线程中更新UI
        textView.setText("Updated text");
    }
});

也可以使用runUInewThread:

runOnUiThread(new Runnable() {
            @Override
            public void run() {
                textView.setText("xxx");
            }
 });
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题