2017-11-14 11 views
0

私は共通のメカニックがいることがわかりました。それを達成するためのより良い方法があるのだろうか。RxJava - イベントが発生するたびにリクエストしてからリクエストします

Observableを購読しているときにネットワークリクエストを行い、特定のイベントが発生するたびに再度リクエストするようにしたいので、オブザーバブルは無限になります。

たとえば、私はgetScreenData()リクエストを持っているとしましょう。私はそれを呼び出す画面を開いたときに、reloginやneedRefreshなどのイベントがある場合は、リクエストを再作成します。次のようである私が思い付く

:私はいくつかのオブジェクトにすべてのこれらのイベントをマッピングする必要があるとして、私はそれがあまり好きではない

Merge(onRelogin().map(a-> null),onNeedRefresh().map(r -> null)).switchMap(o->getData()).startWith(getData); 

だけので、私はそれらをマージすることができるようになります(I値について気にしないでください...)、私はスイッチのためにgetData()を2回書く必要があります。

これを実現するにはより良い方法がありますか?他の演算子と一緒に私にそれを取得します。この変圧器はどのようにして変圧器を作るのですか?あなたは自分自身を繰り返さずにそのパターンを取得しますので、私たちは再び要求をしたいと思う程度の観察を聞くことができません。

編集:Observable.merge()は、マップ

答えて

0

アイテムを発行するときにswitchMapを使用します。これは古いリクエストを投げることを意味します。まだ到着していない場合は重要ですので、取得されたストリームは順調に保たれます。

0

repeatWhen演算子を使用する必要性を解決するため、観察可能返すことができます。

whenToRepeatが何かをemmittingことで繰り返しをトリガーに観察可能である
Observable 
    .fromCallable(() -> getScreenData()) 
    .repeatWhen(it -> it.mergeWith(whenToRepeat)) 
    .subscribe() 

repeatWhenオペレータhereの詳細説明。

public static class SwitchWhen<T> implements Transformer<T,T> { 


    private final Observable<?>[] observables; 

    public static <K> SwitchWhen<K> create(Observable<?>...observables){ 
     return new SwitchWhen<>(observables); 
    } 

    public SwitchWhen(Observable<?>[] observables) { 
     this.observables = observables; 

    } 

    @Override 
    public Observable<T> call(Observable<T> tObservable) { 
     return Observable.merge(observables).switchMap(o -> tObservable).startWith(tObservable); 
    } 
} 

public static <T> SwitchWhen<T> switchWhen(Observable<?>...observables){ 
    return SwitchWhen.create(observables); 
} 

あなたはこのようにそれを使用することができます:あなたはそれに加入するとき、それは要求を行います

getData().compose(switchWhen(onRelogin(),onNeedRefresh()); 

と毎回スイッチのもの観測私は変圧器を作ってしまう

+0

問題を解決したり、私が尋ねたことを実行したりしません。私はrepeatWhenに精通しています、それは私がonCompletedを取得したときにのみ繰り返すことができます、それは私が求めているものではありません。 getScreenData()の完了に関係なく、私のオリジナルの実装は新しいリクエストに切り替わります。あなたがgetScreenDataを要求し、あなたがonNeedRefresh()イベントを待っている間、あなたがリピートを使用した場合、再度リクエストしません。可能であれば、古いデータを取得する可能性があります... – ndori

+0

さらに、コンパイルされません。いつでも復帰できません。 – ndori

+0

@ndoriごめんなさい、リクエストの同時実行を希望しているという質問には指定されていません。しかし、それは私のためにうまくコンパイルされます。 – ESala

関連する問題