はじめに

仕事で作っているアプリで非同期処理のコールバックが地獄めいてきて吐きそうになったので そのあたりをバッチリ解決するためのアレコレを模索していた。

そんな折にKeithYokomaさんがQiitaに海外記事の翻訳を公開したのを読んで、一念発起したという具合です。

EventBusを使う方法も考えたのだけど、あれはLocalBroadcast使うまでもないときに発動させるのがいいんだろうな、という感想です。

そんなわけで、色々と見たこと・考えたことを備忘録としてまとめました。

参考にしたサイトたち

だいたいこれ読んどけばOKみたいなそんな感じです。

入門

応用例とか

お役立ち

ハマリポイントつぶし

その他

理解したことの整理

Reactive ExtensionsはPromiseパターンに似てる

もともとJavaScriptのPromiseパターンは理解していた(AngularJSでは頻出)ので、それと対比して関連付けて着目することが多かった。 Rx == Promise ではない気がする。じゃないとRxJSみたいなものがなんで存在しているのかわからないです。。

RxはPromise++でありcallback++である、と記されたサイトがあった。そういう感じだと思った。

JavaScriptでは(俺の観測範囲では)すべてが非同期で、UIスレッドがどうの〜ということがないし、 適切なコールバックを使うことがある種の慣習となっているので、Promiseの概念は取っ付き易いんだと思う。

一方でスマホアプリはUIスレッドで同期命令を実行すればその間の描画がフリーズする。 なのでそういう命令を使うならば別スレッドで処理を実行し、結果をUIスレッド側にコールバックする必要がある。 そのため、どのスレッドにいるのかを意識してコーディングしないといけないし、スレッドのきめ細やかな調整がとても大事なのだと思う。

RxAndroidはAsyncTaskLoaderを置き換えることができる

詳細はKeithYokomaさんが訳した記事を読んでいただくとして。とにかくAsyncTaskLoaderはつらい。 「開始」「終了」「リセット」くらいしかコールバックを得られないうえ、画面回転の対応も微妙。 柔軟に扱えるようにするにはかなりいろんなことをしないといけなくて、ないよりマシだけどつらい。

しかしRxAndroidなら、(ちゃんとObservableを定義すれば)レスポンス値を見てエラーにできるし、 飛んできたデータに対する加工も簡単。Observableの開始時や終了時に何か実行させたいとか、 いろんなところでコールバックを受けることができるので柔軟性が高い。

AppObservable.bindActivity/bindFragment はハマることがあるので気をつける

詳しくはsys1yagiさんの記事を。

すべてのAsyncTaskLoaderを追放できるか?

日和った答えとしては、まぁちょっとずつやっていくかー。という感想。 RxJavaおぢさんとしてすべての非同期タスクをRxで書いて問題あるのかないのか、まだ答えを出しかねている状態。 あとRxAndroidがまだまだ破壊的変更あったりするというのも気になる(がgradleでバージョン固定できるからそこはまぁ気合でなんとかなる)。

まとめ

という具合です。