我有一个RxJava的情况,我不太明白。我有这个可观察的设置,效果很好。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Prueba</title>
<link rel="stylesheet" href="css/Principal.css"/>
<link rel="stylesheet" href="css/main.css" />
<link rel="stylesheet" href="css/jquery.bxslider.css" />
</head>
<body>
<header>
<div class="subheader">
<div class="register">
<p>Login
</p>
<p>|</p>
<p>Register</p>
</div>
<div class="forms">
<form class="registers" action="demo_form.asp">
<input class="registerformsleft" type="email" name="email" value="Email" placeholder="Format: algo@gmail.com" onfocus="if (this.value=='Email') this.value='';"><br>
<input class="registerformsright" type="password" name="Password" size="10" value="Password" onfocus="if (this.value=='Password') this.value='';"><br>
<input class="submit" type="submit" value="Submit">
</form>
</div>
</div>
</header>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="js/jquery.inputs.js"></script>
</body>
</html>
所以我进行了一次网络调用,如果我得到一个可恢复的异常,我在UI线程中做了一些更改后重试了这个调用。
但是,当然,这一切都是由于一些UI交互,即按钮点击而发生的。那里还有一个可观察的链,所以我修改了这个链也包括这个调用,如下所示:
Observable.create(subscriber -> makeWebCall())
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidScheduler.newThread())
.retryWhen(observable ->
observable.flatMap(throwable -> {
if (throwable instanceof UserRecoverableException) {
return Observable.from(someUIFlowObservable());
}
return Observable.error(throwable);
}))
.subscribe(response -> response.doSomething(), t -> throwError(t));
现在,Rx.click(someButton)
.switchMap(o -> getSomeStringPreferenceObservable())
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(Schedulers.newThread())
.switchMap(str -> Observable.create(subscriber - >makeWebCall()))
.observeOn(AndroidScheduler.mainThread())
.retryWhen(observable ->
observable.flatMap(throwable -> {
if (throwable instanceof UserRecoverableException) {
return Observable.from(someUIFlowObservable());
}
return Observable.error(throwable);
}))
.subscribe(response -> response.doSomething(), t -> throwError(t));
不起作用。应该很明显,两者之间的巨大差异是retryWhen
方法。但我不确定我是否理解发生了什么以及我能做些什么才能获得理想的结果。