2015-12-15 8 views
5

私はRxAndroid observableを使用してオブジェクト(この場合はString)を取得しています。私は私のプレゼンターにサブスクライブし、ビューに結果を投稿RxAndroidでスケジューリングを使用する

public Observable<String> getRandomString() { 
    return Observable.create(new Observable.OnSubscribe<String>() { 
     @Override 
     public void call(Subscriber<? super String> subscriber) { 

      //code to retrieve result 

      subscriber.onNext("this is a string"); 
      subscriber.onCompleted(); 

     } 
    }); 
} 

public void loadRandomString() { 

    Observable<String> observable = mService.getRandomString(); 
    observable 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribeOn(Schedulers.newThread()) 
      .subscribe(new Subscriber<String>() { 
       @Override 
       public void onCompleted() { } 

       @Override 
       public void onError(Throwable e) { 
        mMainView.onError(e.getLocalizedMessage()); 
       } 

       @Override 
       public void onNext(String string) { 

        //do something with string 
       } 
      }); 
} 

これは罰金と、すべての作品が、私はこの操作は、定期的になりたい(すべてのX私のサービスは、このようになります。分)。私はTimerまたはScheduledThreadPoolExecutorこれを何度も何度もやり直すことができますが、私はRxAndroidの領域内にいくつかの解決策があるかどうか確認したいと思います。 2013年から古いソリューションがいくつか見つかりましたが、この時点では多くのコードが廃止されました。これは何らかの再帰を使用して可能ですか、これをより洗練された方法で実現できますか?

ありがとうございます!

+0

は 'getRandomString'は' getString'と同じですか? – Blackbelt

+0

はい!私は簡単にするためにいくつかの名前を変更しました。 –

答えて

6

あなたがおそらく望むのはObservable.interval()です。一定の時間間隔で放出されます。あなたはそのようにように、あなたObservable<String>にそのをflatmapできます。言っ

Observable.interval(3, TimeUnit.MINUTES) 
    .flatMap(new Func1<Long, Observable<String>>() { 
     @Override 
     public Observable<String> call(Long ignore) { 
     return getRandomString(); 
     } 
    }) 
    .subscribe(...insert your subscriber here...); 

- あなたはこの数分ごとにやっているつもりなら、あなたはAlarmManagerまたはJobSchedulerに探したほうが良いかもしれないが、チャンスは、ユーザーがあるので、長い間あなたのアプリに集中することはありません。


さておき、Observable.create()よりObservable.just("this is a string")を使用する方がはるかに簡単になるだろうとして。

+0

あなたの答えをありがとう、これはうまくいくようです! Observable.interval(0、3、TimeUnit.MINUTES)に変更しました。なぜなら、最初は遅延を望んでいないからです。 'AlarmManager'についてのヒントをありがとうございますが、これはあなたの通常のアプリではありません。ユースケースは、アプリが数日間フォアグラウンドになることです。しかし私は 'Observable.just()'部分について混乱しています。オリジナルの投稿では、関連するコードをすべて削除し、元のロジックObservable.just()で 'onNext()'に疑似文字列を挿入しました。十分ではないでしょうか? –

+0

@NielsMasdorpこれらの場合、私は 'defer(() - Observable.just())'を使用します。そうすれば、アイテムが放出される前にコードを実行することができます。 'create()'を使用する際の問題は、(理論的には)要求とバックプレッシャーを処理する必要があり、それが本当の苦痛だということです。 –

関連する問題