3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

日記アプリのMVP化工程記録・3

Posted at

言うは易く行うは難し

工程化記録って銘打ってるので、上手くいかない時でも投稿しようと思います。
きっと次回の投稿では解決しているでしょう、きっとそうです。

GitHubには現状でプッシュしておきましたが、残念ながら正常に動いていません。
今回はこう実装しても動かないっていう記事になります。(なんだそりゃ)
理屈では色々述べられるけど、実際に動かすと上手くいかない良い例ですね。

RxJava2の導入

前回の記事の最後に

きっとRepositoryの移管作業らへんでRxJavaを導入しそうな気配。

だなんて書きましたが、気配はすぐそこにありました。
ちなみに導入の方法は

build.gradle
dependencies {
    compile "io.reactivex.rxjava2:rxjava:2.0.1"
}

を加えただけです。

導入の経緯

Fragmentに書いたDB操作処理をRepositoryに移管する作業の初っ端からRxの導入する機会にぶつかりました。ありがたいことです。
MVP化の順序として
・1つのイベントを契機に、そのイベントの一連の操作が完了するように実装を修正していく
という形を取ったのですが、最初のイベントがリストの初期表示でした。
コメントで記載している

★リスト初期表示イベント・Presenter

に当たります。
Presenter.initList()が該当しますが、期待する機能は

  1. Repository.getFirstList()を実行し、完了の通知を受け取る
  2. 初期表示するべきリストデータ(RealmResults)が1つ以上あるならView.showList()を実行してFragmentにリスト描画を依頼する
    というものです。

上記の実行し、完了の通知を受け取るの部分がRxJavaで実現するべきところかなと。

Single

まずはRepositoryにRealmDBの検索処理を移管します。

PersonRepository
    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の実装です。

PersonPresenter
    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化が完了する時に、これらの軌跡が参考になれば良いのですが。。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?