2017-09-21 6 views
0

Y at-il un moyen de modifier la période Observable.interval lors de l'exécution? et existe-t-il un moyen d'arrêter et de reprendre les ticks Observable.interval? et existe-t-il un moyen de réinitialiser la période d'intervalle? En fait j'utilise le code suivant pour faire une action pour toujours dans un laps de temps, mais je n'ai aucun contrôle dessus pendant l'exécution, je dois arrêter, reprendre, reposer et changer la période à l'exécution .Comment puis-je modifier la période pour Observable.interval, et comment puis-je arrêter et reprendre les graduations observables à l'exécution

Observable.interval(8, TimeUnit.SECONDS).observeOn(AndroidSchedulers.mainThread()) 
        .subscribe(new Observer<Long>() { 
         @Override 
         public void onSubscribe(Disposable d) { 
          Log.i("TAG", "onSubscribe"); 
         } 

         @Override 
         public void onNext(Long aLong) { 
          myMethod(); 
         } 

         @Override 
         public void onError(Throwable e) { 
          Log.i("TAG", "onError"); 
         } 

         @Override 
         public void onComplete() { 
          Log.i("TAG", "onComplete"); 
         } 
        }); 

Je l'ai essayé de le google pour trouver une solution, mais malheureusement je ne trouve pas, et je besoin d'une aide ou d'une ressource s'il y a lieu.

Répondre

1

Ici, il est mon solution pour gérer la question

private PublishSubject<Long> newInterval; 

// reactive programming using RXJava2 
private void prepareObserver() { 
    newInterval = PublishSubject.create(); 

    newInterval.switchMap(currentPeriod -> 
      Observable.interval(currentPeriod, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.single()) 
    ) 
      .doOnNext(v -> runOnUiThread(this::pagerForeword)) 
      .subscribe(); 

    newInterval.onNext(period); 
} 

et pour réinitialiser la période d'intervalle j'appelle

newInterval.onNext(period); 

et vous pouvez trouver la solution complète sur le tutoriel de ressources suivant here

J'espère que cela sera utile!

1

Je ne suis pas sûr à 100% de ce que vous vouliez dire par "Je dois arrêter, reprendre, me reposer et changer la période d'exécution". Mais vous pouvez disposer de souscription et reinit observable avec une nouvelle période sur l'exécution:

Disposable d = Observable.interval(1, TimeUnit.SECONDS) 
      .subscribeOn(Schedulers.single()) 
      .subscribe(new Consumer<Long>() { 
       @Override 
       public void accept(Long aLong) throws Exception { 

       } 
      }); 
    d.dispose();  
2

Comme @DDH indiqué, peut-être la façon la plus simple est d'annuler un intervalle en cours et lancer un nouveau complètement flux.

Toutefois, si vous devez maintenir la chaîne en dessous de l'intervalle pour une raison quelconque, vous pouvez passer à un nouvel intervalle via l'opérateur switchMap, déclenché par un PublishSubject par exemple:

PublishSubject<Long> newInterval = PublishSubject.create(); 

newInterval.switchMap(currentPeriod -> 
    Observable.interval(currentPeriod, TimeUnit.MILLISECONDS) 
) 
.doOnNext(v -> { /* background work */ }) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(/* ... */); 

newInterval.onNext(1000L); 

// sometime later 

newInterval.onNext(200L); 
+1

Tout d'abord Merci @akarnokd. et j'ai quelques petites questions, faire onSuivant travaillant sur l'arrière-plan, alors pourquoi nous avons ajouté observerOn (AndroidSchedulers.mainThread()), deuxième question, à propos de l'abonnement (/ * ... * /), si j'ai implémenté un nouvel Observateur () alors ça ne marchera pas, pour travailler je dois le laisser vide. pourriez-vous décrire s'il vous plaît? –

+0

Pourquoi l'avez-vous dans votre exemple original? Que voulez-vous dire par ne pas travailler? – akarnokd

+1

Désolé, pas besoin de l'utiliser, je l'ai réparé et j'écrirai la solution après l'avoir poussée sur le github. Votre solution a résolu le problème, mais j'ai apporté quelques petits changements pour gérer mon cas de manière claire. –