如何在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
相关产品推荐
相关产品推荐

