Android MVVM架构下Fragment存储ViewModel数据后如何重复调用?
方案说明
你的需求场景下,直接调用LiveData.getValue()获取缓存的数据是完全正确的做法,不需要额外设计事件触发机制。
核心逻辑说明
LiveData本身具备状态持久化能力,你通过select(Item item)方法存入的值会一直保存在MutableLiveData实例中,直到绑定的ViewModel被销毁。它的observe()回调仅会在两种场景触发:
- 观察者首次绑定LiveData时,回调当前已存储的最新值
- 存储的值发生更新时,回调最新值
你需要在多个时机主动取固定值的场景,不需要依赖观察者回调,直接取当前缓存值即可。
具体使用方式
直接在你需要的时机调用getSelected().getValue()即可,注意添加非空判断避免空指针:
// 示例1:按钮点击事件中取用 btnOperate.setOnClickListener(v -> { Item currentItem = model.getSelected().getValue(); if (currentItem != null) { // 执行业务逻辑 } }); // 示例2:生命周期回调中取用 @Override public void onResume() { super.onResume(); Item currentItem = model.getSelected().getValue(); if (currentItem != null) { // 更新对应UI } }
如果你能保证在所有取用前一定已经调用过select(Item item)方法存入数据,也可以在ViewModel中封装快捷获取方法简化调用:
// ViewModel中新增方法 public Item getSelectedItem() { return selected.getValue(); }
之后直接在Fragment中调用model.getSelectedItem()即可。
注意事项
- 仅在主线程调用
getValue()即可保证拿到最新值,如果你是通过postValue()存入数据,避免在postValue()调用后立刻在子线程取数据,可能存在异步延迟 - 如果存在Item后续可能更新的场景,还是建议保留原有的观察者回调来自动更新UI,主动取数据的方式更适合固定值、按需取用的场景
内容的提问来源于stack exchange,提问作者Pritish
相关产品推荐
相关产品推荐

