2016-09-29 3 views
2

現在、私はRxJavaと一緒にRxBindingを使ってビューの変更を観察しているプロジェクトに取り組んでいます。私たちがライフサイクルイベントに簡単にアクセスできるフラグメントやアクティビティでは、実際にはうまくいきます。onResumeのデータストリームにバインドし、のバインドを解除することをおすすめします。イベントバスを使用してRxJavaサブスクリプションを渡す

最近、私たちはRecyclerViewを紹介しました。これは、ビューのリストを表示し、それらのすべては購読したいデータストリームにすることができます。私が直面した問題は、CompositeSubscriptionオブジェクトをアクティビティ/フラグメントからアダプタを介してビューホルダーに渡すことです。もちろん、うまくいきません。ユーザーが画面を離れて戻ってきたときに、ViewHoldersは再作成されません(とonResumeが呼び出されています)。

解決策は、(既存のビュー所有者にアクセスするための)レイアウトマネージャーをライフサイクルに対応させることですが、ロジックレイヤー間でこれらのサブスクリプションリファレンスを渡すために余分なコードを書く必要があります。

しかし、私の同僚の一人がイベントバスを使用することを提案しました。これはイベントのサブスクリプションをアクティビティ/フラグメントに渡すために使用され、CompositeSubscriptionに追加され、それらのすべてが一緒にアンサブスクライブされます。さらに、ユーザーが返品したときにビュー所有者に通知することができます。

このアプローチについてどう思いますか?このアプローチで私が知っておくべき落とし穴がありますか?

答えて

2
  1. ビューのライフサイクルを意識しないでください。これは懸念の分離に違反します。
  2. アダプタのviewBindにclickListenersを使用するだけです。
  3. サブスクリプションをアダプターに渡さないでください。 (アダプタはそれについて知る必要はなく、ライフサイクルも制御する必要はありません)アダプタは、onStopのアクティビティonStartでサブスクライブしているRxエンドポイントと、onStopでのサブスクリプションを提供するだけです。アダプタは、項目のクリックイベントのマーシャリングをObservableに処理できます。

注意:すべての問題にRxJavaを適用しないでください。

+0

"ビューのリストを表示すると、それらのすべてを購読したいデータストリームにすることができます。"私はビューホルダーを意味していましたが、ちょっと単純なクリック可能なビューです。テキストビューを編集します。さらに私が提案したことは、あなたが言及したポイントのどれにも違反していないことです。サブスクリプションはViewHolderからactivity/fragmentに渡されるため、ライフサイクルを意識することはなく、サブスクリプションへのサブスクリプションを渡さないでしょう。それらのサブスクリプションに注意してください。 –

+0

私は私が持っているものについてはbtw私はRxJavaが最良のソリューションだと思う - 複数のデータソース(ビューホルダー)が結合して調整する必要があるデータを放出する - RxJavaは簡単に処理できる。 –

関連する問題