J'essaie donc de créer un observable qui se déclenche régulièrement, mais pour une raison que je n'arrive pas à comprendre, il ne se déclenche qu'une fois. Quelqu'un peut-il voir ce que je fais mal?
Observable<Long> observable = Observable.timer(delay, TimeUnit.SECONDS, Schedulers.io());
subscription = observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
searchByStockHelper.requestRemoteSearchByStock();
}
});
actuellement le délai est fixé à 2
La documentation pour l'opérateur du minuteur dit ceci:
Créer un observable qui émet un élément particulier après un délai donné
Par conséquent, le comportement que vous observez est attendu: la fonction timer()
n'émet qu'un seul élément après un délai.
L’opérateur , d’autre part, émettra des éléments espacés d’un intervalle donné.
Par exemple, cet observable émettra un objet toutes les secondes:
Observable.interval(1, TimeUnit.SECONDS);
Je sais que le sujet est ancien mais peut-être pour les futurs visiteurs. (5 min compte à rebours)
Disposable timerDisposable = Observable.interval(1,TimeUnit.SECONDS, Schedulers.io())
.take(300)
.map(v -> 300 - v)
.subscribe(
onNext -> {
//on every second pass trigger
},
onError -> {
//do on error
},
() -> {
//do on complete
},
onSubscribe -> {
//do once on subscription
});
J'ai implémenté comme ceci dans mon code, car il s'assure que la tâche en cours est terminée avant d'appeler à nouveau, et vous pouvez mettre à jour le retard.
return Single.timer(5, TimeUnit.SECONDS).flatMap(
new Function<Long, Single<Object>>() {
@Override
public Single<Object> apply(Long aLong) {
//create single with task to be called repeatedly
return Single.create();
}
})
.retry(new Predicate<Throwable>() {
@Override
public boolean test(Throwable throwable) {
boolean response = true;
//implement your logic here and update response to false to stop
retry
return response;
}
});