始める前に「やれます!」って言わないほうが良い
見積もる前に出来ますとか、言うべきではないっていう教訓ですね。エンジニアなら。
次の記事が投稿される時にはもちろん解決策を提示する予定です。
前回の記事の〆にそんな事を書きましたが、動作しない原因を突き止めると共に一旦RxJavaでの実装を取りやめました。
なぜ、上手く動作しなかったのか
RepositoryでRealmを操作する際、emitterがnullになるという事は検索結果が出力出来ていないという事です。
よくよくエラーを見ると、
RealmResults<Person> results = mRealmHelper.findAll();
でExceptionを吐いていました。内容は
Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created.
端的にいえば別スレッドで作成されたRealmResultsは渡せない、という事です。
・・・そうでした、RealmResultsはスレッド間で受け渡しができないんでした。
じゃあどうするのか
本日のコミットはこちらになります。(日替わりメニューか)
コミットコメントにも書きましたが、Rxでの実装をやめて同期でRealmを操作するように修正しました。
非同期処理でもRealmResultsをImmutableに変換する、など色んな手法が存在するのですが、今回の目的はあくまでもMVP化です。それを忘れてはいけません。
リアクティブな実装は今後導入予定のRetroFit通信で、好きなだけ非同期通信を学べば良いと思うのです。ここは涙を飲んでMVP化を優先させる事にしました。
つまりどうなったのか
前回の記事で書いたとおり
★リスト初期表示イベント・Presenter
における一連の機能をModel/View/Presenterに分離させました。
mPresenter.initList();
からイベントがスタートして
RealmList<Person> personList = mRepository.getFirstList();
Presenter → Repository へとRealmDBの検索の要求。
Repository → Presenter へと結果の返却。
if (personList.size() != 0) mView.showList(personList);
Presenterは結果から次の動作を判断し、リストデータが存在する時にだけ
Viewへと表示の要求を行います。
showList(RealmList<Person> personList)
最終的にView(Fragment)でリストを描画すれば
★リスト初期表示イベント・Presenter
は動作の完了となります。
基本的なMVPの流れは非Rxでなくても変わりません。個々の役割が明確になっている点がMVP化の利点です。
次回は
だなんて毎回フラグを立ててきましたが、今回のような流れにそってFragmentの機能をどんどん分離させていくだけだと思います。
残念ながらRxの導入は見送りましたが、MVPアーキテクチャへの改造という当初の目標は変わりません。
早くMVP化を完了させて新機能の拡充に入りたいものです。