2017-01-15 6 views
3

私は単純なメソッドを作成しました。これは与えられたサブジェクトにメッセージを(Objectとして)送信します。反対側の加入者はオブジェクトを消費する。RxJava:加入者にいくつかの追加情報を送信する方法

複数のコンシューマに同じ件名を使用するため、メッセージを送信する際に追加の情報、つまり200,300を送信します。したがって、コンシューマは関連性の低いメッセージを除外できます。しかし、何とかそれを行う方法を理解することができません。

追加情報(int型のパラメータが)postToSubject方法で処理することができ、action1ではなく、確かにあなたがどんな解決策を考えることができる場合

subject.onNext(object)を示唆してくださいここでそれを配置する方法。上記方法

public void postToSubject(Object object, Subject subject) { 
    Observable<Object> observable = Observable.create(new Observable.OnSubscribe<Object>() { 
     @Override 
     public void call(Subscriber<? super Object> subscriber) { 
      subscriber.onNext(object); 
      subscriber.onCompleted(); 
     } 
    }); 
    observable.subscribe(new Action1() { 
     @Override 
     public void call(Object object) { 
      subject.onNext(object); 
     } 
    }); 
} 

(目的は、対象にアイテムを送信することで、AndroidのActivityから。件名方法の第2引数によって返される)、以下のように呼ばれる別のアンドロイドで

Method call

コンポーネントクラス(線形レイアウトから継承)では、このメッセージは次のように消費されます。私が追加情報、すなわち200,300を得ることができるならば、それをフィルタリングしてその中にonNext()を入れます。これは私が解決策を考える方法ですが、RxJavaのエキスパートが良い解決策を提供するかもしれません。

consume message

回答:

追加情報は、以下のように、加入者がif (object instanceof Integer)を使用して確認し、次のonNextによって返された次の値()

をフェッチするためのロジックを配置しますonNext()を通過しました

Result

+0

あなたは何を意味するのかよく分かりません。意図を理解するのに役立つもう少しのコードを追加できますか?それがコンパイルされない場合は心配しないでください。 – Bohemian

+0

@ボヘミアン - フォーマットしていただきありがとうございます。関心のある方には関連コードを添付してください。1)メソッド2)メソッド呼び出し3)消費...詳細が必要な場合はお知らせください。参考までに、これは完璧に動作しますが、複数の可能な消費者のために、私は追加のパラメータでそれをフィルタリングする必要があります – Girish

答えて

1

まず、パラメータ/メッセージタイプとしてObjectを使用しないでください一般的な。いくつかの基本クラス、例えばItemを作り、基本的な情報を伝えます。

第二には、Itemのサブクラスを作成し、その上MenuItemButtonItemParametrizedItem、と言います。各サブタイプは追加情報を運ぶことができます。

subject 
    .filter(i -> i instanceof MenuItem) 
    .subscribe(menuItemSubscriber); 
subject 
    .filter(i -> i instanceof ParametrizedItem) 
    .subscribe(paramertizedItemSubscriber); 

:消費者側の使用filter()オペレータに、

public void postToSubject(Item object, Subject<Item> subject) { 
    subject.onNext(object); 
} 

Observable.createは必要ありません...)

第四:

第三に、これはpostToSubject()がどのように見えるかです特定のサブスクライバは、受信する予定のサブタイプ項目を知っているので、そのサブタイプに安全にキャストして、追加情報を抽出できますそのサブタイプに関係する定義。

+0

良い提案に感謝、私は自分のコードに取り入れています。しかし、私の問題はまだそこに残っているようです..同じサブクラス内でMenuItemと言っているようです。私はそれを行うために、多くのうちから1つのサブスクライバを選択する必要があります..つまり、200&300 ..追加の値を送信し、それらの値に基づいて除外します。 – Girish

+0

@Girishどの述語でもフィルタリングできます。例: '.filter(i - > i.getParam()> = 200 && i.getParam()<300)'。注意ここではJava 8ラムダ表記法を使用しています。以前のJavasでは代わりに匿名クラスを使用する必要があります。 –

+0

もう一度onNext()の追加情報をお送りいただき、ありがとうございます。 MenuItemはすべての情報を持っていないので、追加情報すなわち別々に送信されなければなりません。あなたの提案は本当に非常に役に立ち、私にRxJavaの理解を与えました。 – Girish

関連する問題