LoginSignup
0
0

More than 5 years have passed since last update.

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

Posted at

始める前に「やれます!」って言わないほうが良い

見積もる前に出来ますとか、言うべきではないっていう教訓ですね。エンジニアなら。

次の記事が投稿される時にはもちろん解決策を提示する予定です。

前回の記事の〆にそんな事を書きましたが、動作しない原因を突き止めると共に一旦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に分離させました。

View
mPresenter.initList();

からイベントがスタートして

Presenter
RealmList<Person> personList = mRepository.getFirstList();

Presenter → Repository へとRealmDBの検索の要求。
Repository → Presenter へと結果の返却。

Presenter
if (personList.size() != 0) mView.showList(personList);

Presenterは結果から次の動作を判断し、リストデータが存在する時にだけ
Viewへと表示の要求を行います。

View
showList(RealmList<Person> personList)

最終的にView(Fragment)でリストを描画すれば

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

は動作の完了となります。
基本的なMVPの流れは非Rxでなくても変わりません。個々の役割が明確になっている点がMVP化の利点です。

次回は

だなんて毎回フラグを立ててきましたが、今回のような流れにそってFragmentの機能をどんどん分離させていくだけだと思います。

残念ながらRxの導入は見送りましたが、MVPアーキテクチャへの改造という当初の目標は変わりません。
早くMVP化を完了させて新機能の拡充に入りたいものです。

0
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
0
0