2016-05-30 5 views
7

RxJavaを初めて使用し、これをMVPアーキテクチャと共に使用しています。PresenterとRxJava、設定変更のための断片を保持

私は、保持されたフラグメントを使用して構成変更を行った際に観測値を保存する例をいくつか見つけました。私が見つけた例は、プレゼンターからではなく、アクティビティーまたはフラグメント上のオブザーバブルを直接処理することです。

私はこれをテストしたところでquick example(ReactivexのRxJavaとRxAndroidのlibのみを使用しています)を実験して設定しましたが、うまくいくようです。この例の内容は次のとおりです。

  1. ヘッドレスで保存されたフラグメントでアクティビティを開始します。
  2. プッシュボタン
  3. Presenterは、遅延(5秒)応答でFakeServiceを呼び出します。
  4. Presenterはこのオブザーバブルで.cache()を実行します。
  5. Presenterは、この可観測性を保持するビューを指示します。
  6. ビューは、保持可能なフラグメントにオブザーバブルを保存します。
  7. Presenterはobservableにサブスクライブします。
  8. ユーザーは構成の変更を行います(デバイスのローテーション)。ユーザーは、彼が望む回数だけこれを行うことができます。
  9. OnPauseはプレゼンターのCompositeSubscriptionに、現在のすべてのサブスクリプションをクリアし、サブスクライブを解除するように指示します。
  10. アクティビティが再作成され、既存の保持されたフラグメントが再利用されます。
  11. アクティビティのonResumeは、保持されているフラグメントの保存されたobservableがnullかどうかをチェックします。
  12. nullでない場合、Presenterにサブスクライブするように指示します。
  13. 保持されたobservableがサブスクライブされ、.cacheが呼び出されたため、サービスを再度呼び出さずに新しいサブスクライバに結果を再生するだけです。
  14. プレゼンターが最終結果をビューに表示すると、保持されているフラグメントの保存されたobservableもnullに設定されます。

私はこれを正しくやっているのか、観測者のサブスクリプションがPresenterで処理されているときに、より効率的でエレガントな構成変更の処理方法があるのだろうか?


編集:フィードバックのため 感謝。 これに基づいて私はよりクリーンなソリューションだと思っており、リンクされた例を変更して更新しました。

新しい変更が加えられました。 ObservableをPresenterからActivityに渡すのではなく、configurationChangeイベントが発生したときに保存するretainFragmentに渡す代わりに、作成時にretainFragmentを2番目の「ビュー」として設定しました。

このようにして、デバイスの回転後にonResume()が発生した場合、ObservableをretainFragmentからPresenterに戻すことを醜い配管で行う必要はありません。

プレゼンターは、この第2の「ビュー」と直接対話し、保持されている観察可能なもの自体をチェックし、必要に応じて再サブスクライブすることができます。主なアクティビティは、この観測可能性についてもう知る必要はありません。突然、はるかにシンプルなビューレイヤーです。

+0

こんにちは、これは確かに非常に興味深いアプローチだと思います。私はあなたのプロジェクトをクローンし、私はそれを使って遊んでいます。私は、ローダーを使用する向きの変更を扱う別のアプローチに従ってきました。私はあなたが司会者の状態をどのように扱うかに興味があった。特に、サービスが終了し、アクティビティがまだプロセスを保持しているときどの部分が発表者の状態を処理しますか?その部分を少し説明していただけますか?また、このアプローチはアクティビティやフラグメントに対しても機能しますか?そして最後に、このアプローチに続く落とし穴がありますか?ありがとうございました。 –

+0

この方法では、保持されている観測値から結果を再生することができます。つまり、データが失われることはありませんが、onResume()からすべてのデータを再生すると、構成が変更されるたびにuiの状態が再開されます。これは、observableから受信したデータをrecyclerviewに追加してリストをスクロールするときに最もよくわかります。設定が変更されると、アダプタが再び作成され、データがアダプタに再追加されます。再びrecyclerviewの上部。 TL; DR、スクロール位置を保存できません。 – desmondtzq

答えて

2

右、いい仕事についての音!いくつかの提案:

  • Activity.onRetainNonConfigurationInstance()を使用できます。私はそれがアンドロイドNで廃止されなくなったと聞いてきました。あなたがそれを気に入っても問題はありませんが、あなたがフラグメントを使用しないことを望んでいなくても、保持されたフラグメントを使い続けることができます。
  • プレゼンター全体ではなく、観測可能なものだけを保持するのはなぜですか?新しいプレゼンターを作成するのはちょっと無駄かもしれません。おそらく、ビューを「アタッチ」して「切り離す」ことができる同じインスタンスで動作させることができます。しかし、もう一度、あなたが観察から切り離されている間にあなたの観察可能なものが放出されるならば、あなたは何をすべきかに対処しなければなりません。
  • Dan Lewさんが最近を使用しないでください。in his Droidcond SF talkというケースを作成しました。彼はreplay()はあなたに何が起こっているかをより詳細に制御し、replay().autoconnect()cache()と同じ働きをすると言います。彼は私に確信しましたが、自分のために見ます。
+0

貴重なフィードバックをありがとう!最後のN個のapiが未使用のまま残っている場合は、Activity.onRetainNonConfigurationInstance()を再考するために戻ってきます。今のところ私の意見では解決策になるには少し重すぎます。私もあなたがリンクしたビデオを見ました、それは非常に便利です!私にも納得させて、変更を加えました。私は私のサンプルコードを、プレゼンターがobserverableをアクティビティを再び通過することなく直接retainFragmentに格納することを可能にする、よりよい解決策であると思うようにサンプルコードを更新しました。 – jesobremonte

+0

私は助けてうれしいです! :) なぜ、 'onRetainNonConfigurationInstance()'が保持されているフラグメントより重く感じるのか分かりません。後者は前者を使用して実装されます。私は、それが最終版では使用されなくなるのを待って見ても意味があることに同意しますが。 –

3

がよさそうだ、あなたはその一例を見ることができます - https://github.com/krpiotrek/RetainFragmentSample

+0

例をありがとう。私はアクティビティによって直接行われるのではなく、プレゼンターでこれを達成する方法を探していましたが。 – jesobremonte

+1

はい、しかしonSaveInstanceStateとonStart/onCreate/onResumeはActivity/Fragmentコールバックですので、どうにか処理しなければなりません。もちろん、ロジックをプレゼンターまたは他の場所に委譲することもできますが、それでもアクティビティ/フラグメントが出発点です。別の例 - https://github.com/krpiotrek/MvpStateここで、Presenterに状態を渡す方法がわかります。これはDaggerを介して行われますが、それはどんな種類の依存性注入でもあります。 Ofcourse。 – krp

+0

アクティビティ/フラグメントは、ビューの状態に応じて、サブスクライブ/サブスクライブを中止するときにPresenterに通知します。私は、しかし、任意のアンドロイド固有のライフサイクルメソッドの清潔にプレゼンターを保持したい。私がしたのは、プレゼンターが作成されたとき、それはコンストラクターとしての第2の "ビュー"としてのretainFragmentのインターフェースも持ちます。このようにして、プレゼンターは、アクティビティ/フラグメント状態が何であるかを知る必要がなくなります。それは特定のアンドロイドであり、ビュー層にとどまるべきです。 – jesobremonte

-1

このライブラリhttps://github.com/MaksTuev/ferroは、ストア画面データと管理のバックグラウンドタスクのための別の方法が含まれています。

あなたシナリオこの

  1. 開いているアクティビティのように見えますが、プレゼンターを作成します
  2. プッシュBTN
  3. プレゼンターは、観察可能な遅れ(5秒)応答のためのFakeServiceを呼び出します。
  4. 設定がプレゼンターが破壊されていない、変更、観察可能ではunsubscrubedされていない、すべてのRXイベントが凍結されている
  5. 活動作り直さ、プレゼンター再利用は、以前にロードされたデータビュー上のプレゼンターのショーは、すべてのRXイベントが凍結されていないです

    私は、このヘルプが

関連する問題