我有以下项目:https://bitbucket.org/ali-rezaei/storytel/src/master/
我正在使用Android架构组件中的导航库。
当我导航屏幕内容,然后返回到主屏幕,onCreateView并onActivityCreated获得MainFragment再次调用。因此viewModel.showPosts().let { compositeDisposable.add(it) }被称为:
fun showPosts(): Disposable { _isLoading.postValue(true) EspressoIdlingResource.increment() // App is busy until further notice return Network.items.getPosts() .subscribeOn(schedulerProvider.io()) .observeOn(schedulerProvider.ui()) .doFinally { if (!EspressoIdlingResource.countingIdlingResource.isIdleNow) { EspressoIdlingResource.decrement() // Set app as idle. } _isLoading.postValue(false) } .subscribe({ _isDataLoadingError.postValue(false) _posts.postValue(it) }) { _isDataLoadingError.postValue(true) Timber.e(it) } } 它再次在RecyclerView上显示加载微调器,这是不需要的。我该如何解决?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Android中使用Navigation组件时,避免在返回到已经创建的Fragment时重新加载数据或执行不必要的初始化操作,可以通过以下几种策略来解决:
利用ViewModel的生命周期: ViewModel的设计初衷是跨Fragment的重建过程存活,因此可以在这里存储和管理UI相关的数据。确保你的MainFragment
使用了ViewModelProvider
来获取ViewModel实例,并且不要在onCreateView
或onActivityCreated
中直接调用加载数据的方法。而是在ViewModel中检查是否已经加载过数据,例如设置一个标志位。
使用Fragment的savedInstanceState: 在onCreateView
或onActivityCreated
中检查savedInstanceState
是否为null。如果非null,意味着Fragment是从回退栈恢复而不是新创建的,这时可以跳过数据加载逻辑。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
if (savedInstanceState == null) {
viewModel.showPosts().let { compositeDisposable.add(it) }
}
}
利用LifecycleObserver: 你可以在ViewModel中添加一个LifecycleObserver,监听Fragment的生命周期事件,仅在Fragment首次创建时加载数据。
导航选项中的popBehavior: 如果你是通过NavOptions进行导航的,可以考虑设置popUpTo
和popUpToInclusive
属性来控制返回栈的行为,但这通常用于处理返回逻辑而非直接解决数据重载问题。
自定义返回处理: 在需要的地方自定义返回按钮的逻辑,确保当用户返回到主Fragment时,不触发额外的数据加载。
RecyclerView的状态保存: 确保RecyclerView的状态(如滚动位置)在配置改变或Fragment重建时得到保存和恢复,这虽然不直接影响数据加载,但能提升用户体验。
综上所述,主要思路是利用ViewModel维护数据状态,结合Fragment的生命周期来判断是否需要重新加载数据。这样,即使用户导航回来,也不会重复执行不必要的加载逻辑。