Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Migrating to RxJava2 from RxJava1

436 views

Published on

CA.apk #4
https://cyberagent.connpass.com/event/65347
#ca_apk

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

Migrating to RxJava2 from RxJava1

  1. 1. RxJava1 -> RxJava2 CA.APK - YASUHIRO SHIMIZU
  2. 2. ABOUT ME 清水泰博(Yasuhiro Shimizu) ▸ Android Engineer @AWA Co. Ltd. ▸ GitHub: yshrsmz ▸ Twitter: _yshrsmz Omnitweety Monotweety
  3. 3. MIGRATING TO RXJAVA2 今日話すこと ▸ 開発を止めずRxJava2に
 徐々に移行するにはどうしたらいいか ▸ AWAの場合
  4. 4. MIGRATING TO RXJAVA2 今日話さないこと ▸ RxJavaとは何か ▸ RxJava1とRxJava2の違い
  5. 5. MIGRATING TO RXJAVA2 バージョンアップどうやる? dependencies { compile: "io.reactivex:rxjava:1.3.2" } dependencies { compile: "io.reactivex.rxjava2:rxjava:2.1.4" }
  6. 6. これはやめた方がいい
  7. 7. MIGRATING TO RXJAVA2 RxJava1への依存を削除するのはやめた方がいい ▸ RxJava1とRxJava2では変更点が多く、作業にも確認にも時 間がかかる ▸ つまり何度も何度もmasterの変更を取り込まなければなら ない ▸ RxJava1で書いたコードがmasterにどんどん追加されていく
  8. 8. RxJava2Interop を使って、 少しずつRxJava2に移行しよう
  9. 9. MIGRATING TO RXJAVA2 What is RxJava2Interop? ▸ https://github.com/akarnokd/RxJava2Interop ▸ RxJava1とRxJava2のReactive Typeを相互に変換 ▸ 作: David Karnok(RxJavaのmain commiter) ▸ このライブラリを使うとステップ・バイ・ステップで RxJava2に移行できる
  10. 10. MIGRATING TO RXJAVA2 Usage // app/build.gradle android.packagingOptions { exclude 'META-INF/rxjava.properties' } dependencies { compile: "io.reactivex:rxjava:1.3.2" compile: "io.reactivex.rxjava2:rxjava:2.1.4" compile: "com.github.akarnokd:rxjava2-interop:0.10.6 }
  11. 11. MIGRATING TO RXJAVA2 使い方(in java) RxJavaInterop.toV2Flowable(v1Observable); RxJavaInterop.toV2Maybe(v1Single); RxJavaInterop.toV1Observable(v2Publisher); // etc...
  12. 12. MIGRATING TO RXJAVA2 使い方(in Kotlin) fun <T> rx.Observable<T>.toV2Observable() = RxJavaInterop.toV2Observable(this) fun <T> io.reactivex.Observable<T>.toV1Observable() = RxJavaInterop.toV1Observable(this, BackpressureStrategy.LATEST) // v1Observable.toV2Observable() // v2Observable.toV1Observable() 拡張関数を定義すると捗る
  13. 13. ANY REAL-LIFE EXAMPLE?
  14. 14. テキスト 移行の手順 ▸ 各種ライブラリの移行方法検討(Realm, SQLite, Retrofit) ▸ nullを流してるストリームをOptionalに書き換える ▸ ひたすらやっていき💪💪
  15. 15. MIGRATING TO RXJAVA2 Realm ▸ Realm v4.0はRxJava2をサポートする(未リリース) ▸ v3.xでは2つ選択肢がある ▸ RxJava2Interopを使う ▸ v4.0の実装を参考に自分で作る ▸ https://github.com/realm/realm-java/pull/4991 ▸ Kotlinの拡張関数使うと👍👍
  16. 16. テキスト SQLite ▸ 特にライブラリは使わずに実装しているので、地道に書き換 える ▸ Roomへの置き換えも進行中
  17. 17. MITRATING TO RXJAVA2 Retrofit ▸ RxJava2CallAdapterFactoryを使う ▸ RxJava1とRxJava2のCallAdapterは共存できる Retrofit.Builder() .baseUrl("https://api.example.com") .addCallAdapterFactory( RxJavaCallAdapterFactory.create()) .addCallAdapterFactory( RxJava2CallAdapterFactory.create()) .build()
  18. 18. MIGRATING TO RXJAVA2 Architecture of AWA DbClientDbClientDbClient DbClientDbClientApiClient SharedPreferences Realm SQLite API Server DbClientDbClientModel DbClientDbClientUseCase DBCLIENTDBCLIENTActivity/Fragment View Domain Data
  19. 19. MIGRATING TO RXJAVA2 Architecture of AWA DbClientDbClientDbClient DbClientDbClientApiClient SharedPreferences Realm SQLite API Server DbClientDbClientModel DbClientDbClientUseCase DBCLIENTDBCLIENTActivity/Fragment View Domain Data DbClientをRxJava2化 RxJava2Interop でRxJava1に変換 Domainより上の レイヤは変更不要
  20. 20. MIGRATING TO RXJAVA2 Some random tips ▸ doOnDisposeではなくdoFinallyを使う ▸ https://github.com/ReactiveX/RxJava/wiki/What's- different-in-2.0 ▸ Reactive Typeで「値がない状態」を通知したい時はOptionalを 使う ▸ Kotlinだとgojuno/koptionalがミニマムでよさそう ▸ Singleで↑の場合はMaybeを使いましょう
  21. 21. THANK YOU!

×