Kotlin: RxJava -> Coroutineへの置き換えに使えるMigration.ktの紹介
Created at Sat, Jan 30, 2021Kotlin Coroutineには Migration.kt が用意されており、RxJavaからCoroutineへの置き換えを手伝ってくれます。この記事では、どのように使うかを説明します。
例として、次のRxJavaを使ったクラスがあるとします。
import io.reactivex.Observable
class TestRepository {
fun getUser(): Observable<User> {
...
}
}
これは、次のように使うことが出来ます。
val disposble = repository.getUser()
.subscribeOn(Schedulers.io())
.subscribe(
{ println(it) },
{ println(it) }
)
...
このコードを、Coroutineに置き換えていきます。
まず、TestRepositoryクラスのRxJava部分をCoroutineのFlowにします。
import kotlinx.coroutines.flow.Flow
private class TestRepository {
fun getUser(): Flow<User> {
...
}
}
そうすると、使っている側のコードでコンパイルエラーになります。なぜなら、Flow自体には、subscribeOnなどの関数が直接実装されていないためです。
しかし、Flowには拡張関数として、subscribeOnなどの関数が定義されています。なので、IDEの自動補完を使いimportすることで、一部、コンパイルエラーを解消することが出来ます。
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.subscribe
import kotlinx.coroutines.flow.subscribeOn
val disposble = repository.getUser()
.subscribeOn(Schedulers.io())
.subscribe(
{ println(it) },
{ println(it) }
)
これで、置き換え完了かというと、そうではありません。実はsubscribeOnなどの関数は定義されてはいるものの、実際には使うことは出来ません。
では、何が嬉しいかというと、subscribeOn関数は、次のようなエラーメッセージを出力します。
Flowへの置き換えのヒントメッセージを出力してくれます。この場合だと、flowOnを使うことを提案しています。 subscribe拡張関数も同様です。
この拡張関数を使うことで、RxJava -> Coroutineへの置き換えをいい感じに出来ます。
備考
- サポートしている関数は、Migration.ktに定義されています