简体   繁体   中英

How to retrigger an Observable after timer ends in rxjava?

I have a.network call I make as part of a function that fetches the timer value for how long this data is going to be alive (basically the ttl of an object). I need to retrigger the same function as soon as the timer ends.

fun refresh() {
  service.makeNetworkCall()
    .subscribe { response ->
    val ttl = response.ttl
    retriggerAgainAfterTtlExpires(ttl)
}

I'm currently retriggering the function in the .doOnNext() call as shown below. But this doesn't chain the observable to the original one. It creates a whole new process and I want to avoid it.

fun retriggerAgainAfterTtlExpires(ttl:Long) {
  Observable.interval(ttl, ttl, TimeUnit.SECONDS)
                .doOnNext { refresh() }
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
}

How can I retrigger this function without having to call .doOnNext()

Save the TTL in a field and use deferred creation of the initial delay. At the end, simply use repeat .

private long ttl = 1000 // initial TTL

Observable.defer(() -> {
    return Observable.just(ttl).delay(ttl, TimeUnit.MILLISECONDS);
})
.flatMap(v -> service.networkCall())
.doOnNext(response -> { ttl = response.ttl; })
.observeOn(mainThread())
// handle other aspects of response
.repeat()
.subscribe(/* ... */);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM