RxJava испускает предмет с минимальной задержкой - PullRequest
0 голосов
/ 04 мая 2018

У меня есть UserConfig, который я хотел бы загрузить во время заставки.

class UserManager {
    Single<UserConfig> loadConfig()
}

После загрузки UserConfig пользователь перенаправляется на следующий экран. Я делаю что-то вроде этого:

@Override
public void onResume(boolean isNewView) {
    subscriptions.add(
            userManager.loadConfig().subscribe(config -> {
                applyConfig(config);
                launchActivity(HomeActivity.class);
            }, error -> {
                //some error handling
            })
    );
}

Однако я хотел бы показать заставку для не менее 1 секунды . (Если загрузка заняла менее 1 с, добавьте дополнительную задержку)

Я думаю, .delay(), .delaySubscription() не будут работать для моего случая, поскольку они будут задерживать каждый запрос (независимо от того, был ли он короче 1 с или нет).

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Мое решение с функцией расширения kotlin для одного типа. Эта задержка работает аналогично ошибкам

/**
 * sets the minimum delay on the success or error
 */
fun <T> Single<T>.minDelay(time: Long, unit: TimeUnit, scheduler: Scheduler = Schedulers.computation()): Single<T> {
    val timeStart = scheduler.now(TimeUnit.MILLISECONDS)
    val delayInMillis = TimeUnit.MILLISECONDS.convert(time, unit)
    return Single.zip(
        Single.timer(time, unit, scheduler),
        this.onErrorResumeNext { error: Throwable ->
            val afterError = scheduler.now(TimeUnit.MILLISECONDS)
            val millisPassed = afterError - timeStart

            val needWaitDelay = delayInMillis - millisPassed
            if (needWaitDelay > 0)
                Single.error<T>(error)
                    .delay(needWaitDelay, TimeUnit.MILLISECONDS, scheduler, true)
            else
                Single.error<T>(error)
        },
        BiFunction { _, t2 -> t2 }
    )
}
0 голосов
/ 04 мая 2018

Попробуйте Zip оператор

Возвращает сингл, который испускает результаты указанной функции объединителя>, примененный к двум элементам, испускаемым двумя другими синглами.

Вы можете сделать что-то вроде

Single
    .zip(
        Single.timer(1, TimeUnit.SECONDS), 
        userManager.loadConfig(),
        (time, config) -> config
    )
    .subscribe(
        config -> {
            applyConfig(config);
            launchActivity(HomeActivity.class);
        }, error -> {
            //some error handling
        }
     );
...