关于 rxjava-to-coroutines-migration
这是一项面向 Android 和 Kotlin 项目的迁移技能,帮助将 RxJava 代码改写为 Kotlin Coroutines 与 Flow。内容涵盖类型和操作符映射,以及订阅、错误、线程和生命周期的处理步骤。
主要功能
- 01RxJava 类型到协程的映射
- 02Subject 到热 Flow 的映射
- 03调度器与操作符转换
- 04迁移步骤与代码示例
- 05生命周期感知的 Flow 收集
适用场景
- 01将 RxJava 数据源改为 suspend 函数或 Flow
- 02替换 RxJava 操作符和订阅
- 03更新错误与线程处理
- 04按生命周期收集 Flow
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ new-silvermoon/ awesome-android-agent-skills --skill rxjava-to-coroutines-migration安装后在 Claude Code 中输入/rxjava-to-coroutines-migration确认已加载。
详细介绍
RxJava 到 Kotlin 协程迁移技能
一项专用技能,旨在安全且符合惯用写法地将 Android 或 Kotlin 代码库从 RxJava 重构为 Kotlin 协程和 Flow。
迁移映射指南
将 RxJava 组件迁移到 Kotlin 协程时,请使用以下标准映射:
1. 基础类型
Single<T>->suspend fun ...(): T- 一个异步值。
Maybe<T>->suspend fun ...(): T?- 一个可能不存在的异步值。
Completable->suspend fun ...()- 一个完成时不返回值的异步操作。
Observable<T>->Flow<T>- 一个冷值流。
Flowable<T>->Flow<T>- 协程 Flow 原生支持背压。
2. Subject 到热流
PublishSubject<T>->MutableSharedFlow<T>- 向多个订阅者广播事件。如需缓冲,请使用
MutableSharedFlow(extraBufferCapacity = ...)。
- 向多个订阅者广播事件。如需缓冲,请使用
BehaviorSubject<T>->MutableStateFlow<T>- 保存状态,并向新订阅者发出当前/最新值。需要初始值。
ReplaySubject<T>->MutableSharedFlow<T>(replay = N)- 向新订阅者重放最近发出的 N 个值。
3. 调度器到调度器上下文
Schedulers.io()->Dispatchers.IOSchedulers.computation()->Dispatchers.DefaultAndroidSchedulers.mainThread()->Dispatchers.Main- 上下文切换:通常使用
withContext(Dispatcher)或flowOn(Dispatcher)(适用于 Flow)替代subscribeOn和observeOn。
4. 操作符
map->mapfilter->filterflatMap->flatMapMerge(并发)或flatMapConcat(顺序)switchMap->flatMapLatestdoOnNext/doOnSuccess->onEachonErrorReturn/onErrorResumeNext->catch { emit(...) }startWith->onStart { emit(...) }combineLatest->combinezip->zipdelay->delay(挂起函数)或onEach { delay(...) }
5. 执行与生命周期
subscribe()-> 在CoroutineScope中对 Flow 使用collect {},或直接调用挂起函数。Disposable.dispose()->Job.cancel()CompositeDisposable.clear()-> 取消父级CoroutineScope或Job。
执行步骤
- 分析 RxJava 链:确定源类型(Single、Observable 等)、使用的操作符以及订阅发生的位置。
- 转换源:首先修改仓库或数据源层的返回类型。一次性操作转换为
suspend函数,数据流转换为Flow。 - 重写操作符:将 RxJava 操作符转换为对应的 Flow 或协程操作。请注意,许多 RxJava 操作符可直接替换为
map或onEach代码块中的标准 Kotlin 集合/序列操作。 - 更新订阅:在 ViewModel 或 Presenter 中,将
.subscribe(...)替换为launch { ... }和.collect { ... }。确保launch绑定到正确的生命周期作用域(例如viewModelScope)。 - 处理错误:用挂起函数周围的
try/catch或 Flow 上的.catch { }操作符替换onError代码块。 - 处理线程:移除
.subscribeOn()和.observeOn()。必要时使用withContext,或使用.flowOn()更改上游 Flow 的上下文。
转换示例
RxJava:
fun getUser(id: String): Single<User> { ... }
disposable.add(
getUser("123")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ user ->
view.showUser(user)
}, { error ->
view.showError(error)
})
)
协程/Flow:
suspend fun getUser(id: String): User { ... } // Internally uses withContext(Dispatchers.IO) if needed
viewModelScope.launch {
try {
val user = getUser("123")
view.showUser(user)
} catch (e: Exception) {
view.showError(e)
}
}
最佳实践
- 优先使用挂起函数: 除非确实需要随时间产生多个值的数据流,否则默认使用
suspend函数而非Flow。Single和Completable几乎总是转换为suspend函数。 - 状态处理: 在 ViewModel 中使用
StateFlow向 UI 暴露状态,而不是使用BehaviorSubject或LiveData。 - 生命周期感知: 在 UI 层收集 Flow 时使用
repeatOnLifecycle或flowWithLifecycle,避免视图不可见时仍在后台工作。
评论
支持 Markdown