何时需要调用ViewDataBinding的invalidateAll()方法刷新UI?
数据绑定场景下
binding.invalidateAll()的调用时机梳理 本次验证以绑定了@{mainActivity.myName.name}表达式的TextView为测试载体,核心目标是明确不同数据变更场景下,是否需要手动调用binding.invalidateAll()完成UI刷新。
两类验证场景的实测表现
场景1:在onCreate()或onResume()生命周期方法内修改数据
该场景下界面可自动完成更新,无需手动调用invalidateAll()。
- 对应实现流程:初始化
ActivityMainBinding实例后绑定mainActivity引用,在onCreate()中将myName.name赋值为"Data is visible directly" - 实测结果:待界面完成初始绘制后,
TextView可直接展示最新的文本值,全程未做手动刷新操作也能正常显示更新后内容。
场景2:通过按钮点击事件触发数据修改
该场景下必须手动调用binding.invalidateAll()才能完成界面更新。
- 对应实现流程:在点击回调方法
onButtonClickedChangeData()中,将myName.name修改为"Data is visible only after invalidateAll is called" - 实测结果:若不执行
binding.invalidateAll(),TextView的文本内容不会发生任何变化。
前期推断的实测校验
测试开展前曾做出如下推断:只有当Activity处于运行态、界面已对用户可见时修改数据才需要调用invalidateAll(),若在界面完成绘制前修改数据则无需手动调用。
但实测结果与该推断不符:在onResume()生命周期方法中修改数据时,同样无需调用invalidateAll()即可完成界面自动更新,这套推断逻辑并不成立。
内容的提问来源于stack exchange,提问作者Yousef Gamal
相关产品推荐
相关产品推荐

