我想在启动画面中下载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)。
答案 0 :(得分:1)
尝试Zip运算符
返回发出指定组合函数结果的Single>适用于另外两个单身人士发出的两件物品。
您可以执行类似
的操作Single
.zip(
Single.timer(1, TimeUnit.SECONDS),
userManager.loadConfig(),
(time, config) -> config
)
.subscribe(
config -> {
applyConfig(config);
launchActivity(HomeActivity.class);
}, error -> {
//some error handling
}
);
答案 1 :(得分:1)
我的解决方案具有针对单一类型的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 }
)
}