Search code examples
javarx-javarx-java2

How can I delay the onSuccess and onError methods in RxJava?


I posted this question about how to delay the onSuccess method in RxJava about 9 months ago. Here is a summary of the question:

The SplashScreenFragment is a fragment that loads data from a server using Retrofit with RxJava. The data may take between 1 to 25 seconds to be retrieved. The SplashScreenFragment must be shown to the user for at least 8 seconds. When the data is retrieved, the onSuccess method is called and the user is navigated to the HomeFragment.

The goal is to delay the onSuccess method based on the time it takes to retrieve the data from the server. If it takes less than 8 seconds, the onSuccess method should be delayed for the remaining time. If it takes more than 8 seconds, the onSuccess method should be called immediately. Is there a way to do this using RxJava?

The answer of akarnokd worked for me and successfully delayed the onSuccess method. But I want to also delay the onError method because his answer did not delay the onError method. How can I do this using RxJava?


Solution

  • Option1:

    private fun setupSplashTimer() {
    loadApiFromServer()
    Single.timer(8, TimeUnit.SECONDS)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .doAfterTerminate {
            // this method will be called after 8 seconds
            // Next screen
        }
        .subscribe({
            // Call success
        }, {
            // Call error
        })
    }
    
    private fun loadApiFromServer() {
    // Call api here
    }
    

    Option2: add onErrorReturn { "" } . this is sample

    private fun setup() {
        Single.zip(loadApiFromServer().onErrorReturn {
            ""
        }, delayTimer()) { a, b ->
            Pair(a, b)
        }.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({
    
            }, {
    
            })
    }
    
    private fun loadApiFromServer(): Single<String> {
        return Single.fromCallable {
            ""
        }.subscribeOn(Schedulers.io())
    }
    
    
    private fun delayTimer(): Single<Long> {
        return Single.timer(8, 
    TimeUnit.SECONDS).subscribeOn(Schedulers.io())
    }