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

如何在Architecture Components ViewModel中刷新数据

FeedViewModel实现分析与Fragment数据观察指南

我来帮你拆解这段FeedViewModel的实现,以及后续在Fragment中观察数据的最佳实践:

你的FeedViewModel实现代码

public class FeedViewModel extends ViewModel { 
    private final FeedRepository repository; 
    private LiveData<Resource<List<Photo>>> feed; 

    @Inject 
    FeedViewModel(@NonNull final FeedRepository repository) { 
        this.repository = repository; 
    } 

    LiveData<Resource<List<Photo>>> getUserFeed() { 
        if (feed == null) { 
            feed = new MutableLiveData<>(); // 这行代码无效,后续会被覆盖,建议直接删除
            feed = repository.get(); 
        } 
        return feed; 
    } 
}

代码细节优化说明

  • 先提个小问题:getUserFeed()里的feed = new MutableLiveData<>();完全是多余的——你刚创建了一个空的MutableLiveData,紧接着就把feed变量替换成了repository.get()的返回值,这行代码删掉不影响功能,还能精简代码。
  • 用@Inject注解构造函数,说明你在使用依赖注入框架(比如Hilt/Dagger)提供FeedRepository,这是很棒的解耦方式,能让ViewModel和具体的数据源实现彻底分离,后续替换数据源会非常方便。

Fragment中观察Feed数据的完整实现

你提到在Fragment中通过@Over...的方式观察数据,这里给你补全符合Jetpack最佳实践的代码:

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    
    // 获取ViewModel实例(如果用Hilt可以用@ViewModelInject,这里是标准的ViewModelProvider方式)
    FeedViewModel viewModel = new ViewModelProvider(this).get(FeedViewModel.class);
    
    // 观察Feed数据,必须用getViewLifecycleOwner()避免内存泄漏
    viewModel.getUserFeed().observe(getViewLifecycleOwner(), resource -> {
        switch (resource.status) {
            case SUCCESS:
                // 处理成功返回的数据,比如更新RecyclerView适配器
                if (resource.data != null) {
                    yourPhotoAdapter.submitList(resource.data);
                }
                // 隐藏加载状态
                hideLoadingView();
                break;
            case LOADING:
                // 显示加载中UI,比如ProgressBar
                showLoadingView();
                break;
            case ERROR:
                // 处理错误情况,比如显示提示信息或错误页面
                Toast.makeText(requireContext(), resource.message, Toast.LENGTH_LONG).show();
                hideLoadingView();
                break;
        }
    });
}

关键注意事项

  • 必须用getViewLifecycleOwner():别用Fragment本身作为LifecycleOwner,Fragment的生命周期比它的View长,用View的生命周期所有者能避免View销毁后仍收到数据更新导致的内存泄漏。
  • 覆盖所有Resource状态:你的LiveData封装了Resource类,一定要处理SUCCESS/LOADING/ERROR三种状态,确保UI能正确响应不同的数据源状态。
  • 利用ViewModel的生命周期优势:ViewModel会在配置变化(比如屏幕旋转)时保留实例,getUserFeed()里的判空逻辑能保证这类场景下不会重复触发数据源请求,这是ViewModel的核心价值之一。

内容的提问来源于stack exchange,提问作者lounah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:24:55