言うは易く行うは難し
工程化記録って銘打ってるので、上手くいかない時でも投稿しようと思います。
きっと次回の投稿では解決しているでしょう、きっとそうです。
GitHubには現状でプッシュしておきましたが、残念ながら正常に動いていません。
今回はこう実装しても動かないっていう記事になります。(なんだそりゃ)
理屈では色々述べられるけど、実際に動かすと上手くいかない良い例ですね。
RxJava2の導入
前回の記事の最後に
きっとRepositoryの移管作業らへんでRxJavaを導入しそうな気配。
だなんて書きましたが、気配はすぐそこにありました。
ちなみに導入の方法は
dependencies {
compile "io.reactivex.rxjava2:rxjava:2.0.1"
}
を加えただけです。
導入の経緯
Fragmentに書いたDB操作処理をRepositoryに移管する作業の初っ端からRxの導入する機会にぶつかりました。ありがたいことです。
MVP化の順序として
・1つのイベントを契機に、そのイベントの一連の操作が完了するように実装を修正していく
という形を取ったのですが、最初のイベントがリストの初期表示でした。
コメントで記載している
★リスト初期表示イベント・Presenter
に当たります。
Presenter.initList()が該当しますが、期待する機能は
- Repository.getFirstList()を実行し、完了の通知を受け取る
- 初期表示するべきリストデータ(RealmResults)が1つ以上あるならView.showList()を実行してFragmentにリスト描画を依頼する
というものです。
上記の実行し、完了の通知を受け取るの部分がRxJavaで実現するべきところかなと。
Single
まずはRepositoryにRealmDBの検索処理を移管します。
public Single getFirstList() {
return Single.create((SingleOnSubscribe<RealmResults<Person>>) emitter -> {
try {
RealmResults<Person> results = mRealmHelper.findAll();
emitter.onSuccess(results);
} catch (Exception ex) {
emitter.onError(ex);
}
});
}
戻り値で検索成功ならonSuccessを、失敗ならonErrorが通知される目論見です。
次に通知を受ける側のPresenterの実装です。
public void initList() {
mRepository.getFirstList()
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.single())
.subscribe(new DisposableSingleObserver<RealmResults<Person>> () {
@Override
public void onSuccess(RealmResults<Person> results) {
if (results.size() != 0) {
mView.showList(results);
}
}
@Override
public void onError(Throwable e) {
// error
}
});
}
冒頭に書きましたが、上手くいっていません。
正確に記述するとRepositoryの時点でonErrorが実行され、PresenterのonErrorが通知されてしまいます。
ポジティブに考えれば、少なくとも通知の機能は動いてるようです。
Rxに慣れ親しんだ方が読めば、きっと盛大な間違いや勘違いに気づかれるかと思いますが、
現状分かっているのは
emitterがnullの為、RepositoryのonSuccessが実行されない って事くらいです。
何者なのだ、emitter・・・(要検索案件)
次回は
次の記事が投稿される時にはもちろん解決策を提示する予定です。
MVP化が完了する時に、これらの軌跡が参考になれば良いのですが。。