読者です 読者をやめる 読者になる 読者になる

daisuke_nomura の日記

Android プログラマーな鉄道ファンのブログ

Kii Cloud の RxJava 2 ライブラリ作った

RxKii

RxKii という Kii Cloud の RxJava 2 ラッパーライブラリを作りました。
RxJava 2 の Completable or Single or Observable を返してきます。

github.com

クラス名は、Kii のクラスに Rx を足したものになってます。
KiiObject -> RxKiiObject

コールバック地獄

Kii Cloud Android SDK は多くの API で同期と非同期の両方が揃っています。
ただ当然ながら、非同期 API を使うとコールバック地獄に陥り、ネストが非常に深くなってしまうので、 RxJava で返すようにしました。

Completable or Single

RxKii では、 Completable で返してくる API が多いです。
これは、 RxKiiUser を見ると分かります。

RxKii/RxKiiUser.java at master · daisuke-nomura/RxKii · GitHub

Completable は返す値がない場合に用いられるので、 save/update/delete は自然と Completable になります。

例外は refresh で、kiiUser.refresh(); は Single を返します。ここも Completable になるはずですが、 KiiUser を返します。 これは、 refresh 後に flatMap で次の処理につなぐだろうという想定でこうしました。

Observable を返すのは KiiUploader/KiiDownloader のみ

Observable を返すのは、 KiiUploader/KiiDownloader をラップしたRxKiiUploader/RxKiiDownloader の transferAsObservable だけです。 非同期 API が返す onProgress をラップし、onNext で進捗状況を返してきます。

RxKii/RxKiiUploader.java at master · daisuke-nomura/RxKii · GitHub

ここで見つけましたが、 Kii Cloud Android SDK の KiiRTransferCallback の onTransferCompleted の 引数 Exception に @NonNull アノテーションが付いていますが、Kii のドキュメントを読むと、この Exception は正常時には null のはずなので、RxKii では null チェックを行っています。

Object Body のアップロード

ここは @Nullable の間違いだろうと Kii のTwitterに報告済みです。

Completable を flatMap で繋ぐ際の注意点

また、 README に書いたサンプルを実行した際に気付きましたが、Completable から Single に繋ぐ際に、 Maybe を経由し、 flatMapSingle すると NoSuchElementException になるので、ご注意。

RxJava 2でNoSuchElementExceptionに遭う件 - Qiita