2017-09-20 17 views
1

毎分リフレッシュしたいリストがあります。たとえば ここでは、ユーザーリスト:https://github.com/android10/Android-CleanArchitecture/blob/master/domain/src/main/java/com/fernandocejas/android10/sample/domain/interactor/GetUserList.javaRxJavaポーリング+手動リフレッシュ

私はrepeatWhenを使用して定期的なリフレッシュを追加します。

public Observable<List<User>> buildUseCaseObservable(Void unused) { 
    return this.userRepository 
     .users() 
     .repeatWhen(new Function<Observable<Object>, ObservableSource<?>>() { 
      @Override 
      public ObservableSource<?> apply(Observable<Object> objectObservable) throws Exception { 
      return objectObservable.delay(1, TimeUnit.MINUTES); 
      } 
     }); 
    } 

それは毎分onNext呼び出し、罰金このように動作します。 しかし、(ユーザーの行動や通知のために)このリストを直ちに更新したい場合は、その実行方法がわかりません。

オブザーバブルをキャンセル/廃棄して新しいものを再起動する必要がありますか?あなたはリフレッシュ時間を調整すると懸念されていない場合、他の観測の一つでは、次のような何かを行うことができ、データを発した後 おかげ

答えて

1

お客様のコードから、私はユーザーリストが生成され、サブスクリプション時に発行されることを理解しています。 、代わりにrepeatWhen演算子を使用しての

  1. flatMapと組み合わせるinterval creation operatorを使用します。ここでは

    ではなく、あなたがすぐに反応したいイベント時に退会とresubscribingの私は考えることができるいくつかの解決策、あります毎分新しいObservableのサブスクリプションを呼び出し、merge演算子を使用して、関心のある他のイベントに反応を追加します。

    @Test 
    public void intervalObservableAndImmediateReaction() throws InterruptedException { 
        Observable<String> obs = Observable.interval(1, TimeUnit.SECONDS) 
           .cast(Object.class)           
           .mergeWith(
              Observable.just("mockedUserClick") 
                .delay(500, TimeUnit.MILLISECONDS)) 
           .flatMap(
             timeOrClick -> Observable.just("Generated upon subscription") 
             ); 
    
        obs.subscribe(System.out::println); 
        Thread.currentThread().sleep(3000); //to see the prints before ending the test 
    } 
    

    やニーズに調整する(しかし、校長は同じです):このような何か

    Observable.interval(1, TimeUnit.MINUTES) 
          .mergeWith(RxView.clicks(buttonView)) 
          .flatMap(timeOrClick -> this.userRepository.users()); 
    
  2. あなたは現在の実装作業に保ちながらも、前と同じようにflatMap演算子を使用することができますし、インターバルに合併することなく - あなたの作業コードをそのまま残して、プログラムチェーンの別の領域にあなたの選択したRxBindingにしてください:

    このソリューションでは、サブスクリプションは2つのオブザーバに独立して行われることに注意してください。別のオブザーバーを使用したり、その行のサブジェクトや何かを管理したりする方が、おそらく良いでしょう。私が走った小さなテストでは、1人の加入者が2つの異なる観測値に問題なく(Rxjava1ではまだRxjava2をチェックしていませんでした)加入していましたが、それは私にとっては気になります。

+0

インターバルとマージを使用すると面白いようですが、ありがとうございます。 RxViewを使用する代わりに手動で "リフレッシュ"をトリガーするにはどうすればよいですか? –

+0

Subjectを使用して、プログラム内のどこからでも 'onNext'を呼び出すことができます。 –

1

は:

// Specific example of a user manually requesting 
    val request = Observable.create<String> { emitter -> 
     refresh.setOnClickListener { 
      emitter.onNext("Click Request") 
     } 
    } 
      .observeOn(Schedulers.io()) 
      .flatMap { 
       userRepository.users() 
      } 

    // Refresh based off of your original work, could use something like interval as well 
    val interval = userRepository.users() 
      .subscribeOn(Schedulers.io()) 
      .repeatWhen { objectObservable -> 
       objectObservable.delay(1, TimeUnit.MINUTES) 
      } 

    // Combine them so that both emissions are received you can even add on another source 
    Observable.merge(request,interval) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe({ 
       contents.text = it.toString() 
      }, { 
       contents.text = it.toString() 
      },{ 
       println(contents.text) 
      }) 

次に、あなたは処分して再登録する必要はありません。毎回

関連する問題