Android架构组件与RxJava:RxJava-Android-Samples中的ViewModel
在Android开发中,屏幕旋转导致的异步任务中断和数据丢失一直是开发者面临的常见问题。传统解决方案如onRetainNonConfigurationInstance()或第三方库往往需要编写大量模板代码,且难以维护。本文将通过分析RxJava-Android-Samples项目中的具体实现,展示如何结合Android Architecture Components的ViewModel与RxJava,优雅地解决这一痛点。
ViewModel与RxJava的协同优势
ViewModel作为Android Jetpack架构组件的核心成员,其生命周期独立于Activity/Fragment的配置变化特性,与RxJava的响应式数据流模型天然契合。两者结合可实现:
- 数据自动保留:ViewModel在屏幕旋转时不会被销毁,确保RxJava数据流不中断
- 内存泄漏防护:通过ViewModel的
onCleared()方法可统一管理RxJava订阅的生命周期 - 跨组件通信:支持Fragment间通过共享ViewModel共享RxJava数据流
RotationPersist3Fragment实现解析
RotationPersist3Fragment.kt是项目中展示ViewModel与RxJava结合的关键实现。该类通过以下步骤构建旋转安全的数据流:
1. ViewModel实例化
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
sharedViewModel = ViewModelProviders.of(activity).get(SharedViewModel::class.java)
}
通过ViewModelProviders.of(activity)获取与Activity生命周期绑定的ViewModel实例,确保旋转后Fragment重建时能获取同一ViewModel实例。
2. 数据流订阅管理
@OnClick(R.id.btn_rotate_persist)
fun startOperationFromWorkerFrag() {
logs = ArrayList<String>()
adapter.clear()
disposables +=
sharedViewModel
.sourceStream()
.subscribe({ l ->
_log("Received element $l")
})
}
使用CompositeDisposable管理RxJava订阅,在onPause()时自动清理:
override fun onPause() {
super.onPause()
disposables.clear()
}
SharedViewModel核心实现
SharedViewModel作为数据持有层,封装了RxJava数据流的创建与管理:
1. 热数据流创建
var sharedObservable: Flowable<Long> =
Flowable.interval(1, TimeUnit.SECONDS)
.take(20)
.doOnNext { l -> Timber.tag("KG").d("onNext $l") }
.replay(1)
.autoConnect(1) { t -> disposable = t }
使用replay(1)操作符缓存最新数据,确保新订阅者(如旋转后的Fragment)能立即获取最近一次发射的数据。autoConnect(1)在第一个订阅者出现时自动连接数据源。
2. 生命周期管理
override fun onCleared() {
super.onCleared()
Timber.tag("KG").d("Clearing ViewModel")
disposable?.dispose()
}
在ViewModel即将被销毁时,通过onCleared()方法释放RxJava资源,有效防止内存泄漏。
实际运行效果
该实现通过fragment_rotation_persist.xml布局提供交互界面。点击"开始操作"按钮后,即使频繁旋转屏幕,数字计数仍会连续递增,证明数据流在配置变化中保持连续。
旋转持久化演示
最佳实践总结
- 单一数据源:确保RxJava数据流仅在ViewModel中创建,避免在UI层生成数据流
- 订阅管理:始终使用
CompositeDisposable在UI组件生命周期方法中管理订阅 - 数据缓存策略:根据需求选择合适的RxJava操作符(如
replay、cache)缓存数据 - 清理机制:在ViewModel的
onCleared()中释放所有RxJava资源
通过上述模式,RxJava-Android-Samples项目展示了如何利用ViewModel与RxJava构建真正旋转安全的Android应用,为开发者提供了可直接复用的架构模板。建议结合项目中的RotationPersist3Fragment.kt完整代码深入学习。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



