最近完全にAndroidアプリをメンテするおじさんと化している駄猫です、こんにちは
今回はRxAndroid便利ですね、というお話
あ、subscriptionはほんとにお金かかるはずなので、試さないように
なぜ突然RxAndroid使おうと思ったか
- Java(Android)のFutureが不便だったところで出会った
- scalaのFutureを期待してはいけません
- このスライドのこの辺に大体同意できてしまう
- Callbackダルい
なぜ課金周りか
- 非同期で動かす前提
- 購入結果は
onActivityResult
にCallbackされる
てな感じで練習用に良かった
良かった点
非同期処理が楽
- とりあえず処理書く
- Observableで包む
- subscribeOnで実行スレッド決める
すっごい適当に書くとこんな感じ
Observable.create(...)
.subscribeOn(Schedulers.newThread())
.subscribe(s -> log.debug(s));
非同期処理が複数でも楽
final Observable<A> o1 = Observable.create(...);
final Observable<B> o2 = Observable.create(...);
o1.flatMap(o1Result -> o2)
.subscribeOn(Schedulers.newThread())
.subscribe(s -> log.debug(s));
こんなんで、o1の処理成功したらo2の処理やってくれて楽
UIThreadで動かさなければならない時も楽
observeOn
で以降の動作Threadを切り替えられるので本家のサンプルのように書くだけ
よくわからない点
callbackの消し方
消し方っていうと語弊がありそうですけど…
Inapp Billingの場合、購入時にonActivityResultで結果が返ってくるのがネックなイメージ
(まあ言い出したらそれ以外にもなんでこんな仕様なの…的なものは…)
わかりやすいのは
Result result = Iab.buy(item);
// result 見れば答えがわかる!
だと思うんですよね
こういう感じにするために、今回はonActivityResult呼び出し時にPublishSubject#onNextを使いました
実際の購入処理のところでは
という書き方が可能になります
なのでメソッド呼び出し側から見れば、「購入メソッドを叩いたら購入結果が得られた」みたいな感じになって主に自分が嬉しいですね
という結果になりました
ただまあ…他にも(もっと楽で簡潔な)方法があるんじゃないかなぁ…とも思っています
詳しい人教えてください
個人的な感想
- RxAndroid(RxJava)便利なのでみんな使いましょう
- この辺とかよくわかってない