You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:15:03