DroidKaigi 2017 に登壇しました

DroidKaigi 2017 で「全て S になる -RxJava と LWS を持ち込む楽しさ-」というタイトルの発表をさせていただきました。

全てSになる -RxJavaとLWSを持ち込む楽しさ- from Ryutaro Miyashita

ちょうど 1 年前に Android N Preview 1 が登場し、同時に Jack を使って Java 8 を使った Android アプリ開発が行えるようになりましたが、 Stream API や Optional API は minSdkVersion 24 からと、非現実的な設定が必要でした。まだ Android 7.x は 3% 未満のシェアしかありません

しかし、 Retrolambda で Java 8 の言語機能を手に入れ、 Lightweight Stream API で Stream API / Optional API を手に入れ、 RxJava でより良いアーキテクチャを手に入れることができるということを今回伝えたくて発表を行いました。

RxJava も Lightweight Stream API も Fluent Interface となっていて、頭の中で考えた処理の順番をそのままコードに表現しやすいメリットがあると考えています。また、手続き的なコードから宣言的なコードになりやすいため、変数を final にして不変で安全なコードも書きやすいです。

// Before
FragmentManager fm = getSupportFragmentManager();
Fragment f = fm.findFragmentByTag("MY_FRAGMENT");
MyFragment mf;
if (f != null && f instanceof MyFragment) {
  mf = (MyFragment) f;
} else {
  mf = MyFragment.newInstance();
}

// After
final Fragment fm = getSupportFragmentManager();
final MyFragment = Optional.ofNullable(fm.findFragmentByTag("MY_FRAGMENT"))
  .select(MyFragment.class)
  .orElseGet(MyFragment::newInstance);

また、 RxJava の結果通知を Either 型を使って行うことで、

の 3 種類を Observable / Flowable の .subscribe で受け取れる件も話をしました。 Either 型を定義するときに Optional を使うことで「値が無い」ことを型として表現できるメリットがあります。

Optional を使った Either 型のコードは Gist に掲載しています

webApiRequest
  .subscribeOn(Schedulers.computation())
  .observeOn(AndroidSchedulers.mainThread())
  .subscribe(either -> either.apply(
    failure -> {}, // 意図した失敗
    success -> {}), // 成功
    error -> {} // 意図しない失敗
  );

View の各種イベントも RxBinding で Observable Stream に変換することができますし、 HTTP リクエストも Retrofit といったライブラリが既に RxJava 対応しています。つまり、 View も Business Logic も、 Android アプリ内のコード全てが Stream になる……という思いを込めて、今回のセッションタイトルとしました。

反省点としてはスライドにコードが多く、細かすぎて言葉では伝えづらかったこと、事前リハーサル通りに全く話せなかったことがあります。もし、来年も CFP を出すことがあり、それが通って話すことができるようであれば、反省点を活かしてよりよい発表ができるように努めます:)

 
2
Kudos
 
2
Kudos

Now read this

Realm meetup #3 に参加しました

モバイル向け DB である Realm のミートアップイベントに参加しました。初回は私も発表しました。 3 回目の今回は、日本で Realm の開発をされている岸川さんから近況のアップデート報告があり、 3 件の iOS 側での利用事例がありました。 今回から、発表の内容に関してはビデオ撮影が行われていて、後ほど掲載されることになっているそうです。 Realm を使っていてハマるところとして、 マルチスレッド マイグレーション nil / null の扱い... Continue →