I would like to delay the response at maximum for 500milliseconds. If updateData has taken say 400 milliseconds then I would like to delay for 100 milliseconds.
With below code always I am delaying 500milliseconds. At the moment If backend taking 600 milliseconds then the total delay is 1100 milliseconds but I would like not to delay if it's over 500 milliseconds.
compositeDisposable.add(someRepo.updateData(dataRequest)
.observeOn(schedulerProvider.mainThread())
.delay(500, TimeUnit.MILLISECONDS)
.subscribeWith(dataUpdateObserver())
Try like this. Start a timer parellally when you start someRepo.updateData(dataRequest). Then on complete of someRepo.updateData(dataRequest) get the timer count and find the required delay.
If it has alreay exceeded 500milliseconds, no further delay is required. else find the required delay (500 - elapsedTime). Following code does the same. Here someRepo.updateData(dataRequest) returns Single<DataResponse>
Subject<Boolean> timerStopper = PublishSubject.create(); // To terminate the timer
Observable<Long> timer = Observable.interval(1, TimeUnit.MILLISECONDS)
.takeUntil(timerStopper).publish().refCount();
someRepo.updateData(dataRequest).doOnSubscribe(__ -> timer.subscribe())
.flatMap(dataResponse -> timer.flatMapSingle(elapsed -> {
timerStopper.onNext(true); // take the elapsed time and terminate the timer
long requiredDelay = elapsed > MAX_DELAY ? 0 : MAX_DELAY - elapsed; // find the required delay from elapsed. If its already exceeded Maximum delay, no delay is required
Log.d(TAG, "requiredDelay: " + requiredDelay);
return Single.fromCallable(() -> dataResponse).delay(requiredDelay, TimeUnit.MILLISECONDS);})
.map(data -> data).firstOrError())
.subscribeWith(dataUpdateObserver());
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With