RxT4Aの紹介 #potatotips 19
これは何
動機
- RxAndroidの先行きが不透明
- 社内で作ってるRxJava用ユーティリティを公開したい(未着手)
- RxJavaのベストプラクティスやバッドくラクティスを
example/
に提供したい(未着手)
提供しているもの
AndroidSchedulers
- main threadで実行するスケジューラAndroidCompositeSubscription
-CompositeSubscription
をAndroidコンポーネントで使いやすくしたものOperatorAddToCompositeSubscription
- method chain中にAndroidCompositeSubscription#add()
をするためのオペレータOperatorFilterLite<T>
-filter()
で戻り値のためのオブジェクト生成をしないようにするもの
AndroidSchedulers
- RxAndroidのものと同じ
AndroidSchedulers.mainThread()
AndroidSchedulers.from(Handler)
Schedulers
- コールバックベースのAPI clientをobservable化したケースではそもそも必要ない
- 通常、API requestはbackground threadで実行されるはず
Schedulers.newThread()
は新しいスレッドを生成するので非効率だと思われるSchedulers.io
とSchedulers.computation()
を使い分ける?- AsyncTaskのExecutorServiceに乗っかりたい気もする(未検証)
Schedulersのベストプラクティス
- To be continued...
AndroidCompositeSubscription (ACS)
CompositeSubscription
は同じインスタンスを再利用できない仕様- これがAndroid componentの「同じインスタンスがsuspend/resumeする」という特徴と相性が悪い
- ACS は同じインスタンスを再利用できるのでActivityのfinalフィールドとして持てる
OperatorAddToCompositeSubscription
- ACSを簡単に使えるようにするためのオペレータ
observable.lift(new OperatorAddToCompositeSubscription(compositeSubscription))
するだけcompositeSubscription.add(observable)
と同じだがメソッドチェインに混ぜられる
- ACS自体は
Activity#onPause()
やActivity#onDetach()
でunsubscribe()
する
OperatorFilterLite
filter()
と同じだが述語オブジェクトでBooleanオブジェクトではなくprimitiveのboolean値を使うlift(new OperatorFilterLite<T>() { ... })
とするだけ
実装していないもの
- 各種eventのobservable化
- サポート予定なし。RxBindingを使おう
- AppObservable
- 正しく実装するのが困難なためサポート予定なし
- ACSを使おう
ToDo
- RxBindingとRxAndroidの動向を見守る
- OperatorFilterLiteはRxJavaに提案してもいいかも