我在Android项目中使用RxJava,并希望确保我能正确实现某些内容。
我正在使用Observable登录服务器。登录后我可能想在客户端保存用户名,所以我使用doOnNext()运算符来执行此操作。以下是一个示例:
Observable<Response<Void>> doLogin(Observable<Response<Void>> retainedObservable, Subscriber subscriber, String username, String password, boolean saveUsername) {
if (retainedObservable == null) {
retainedObservable = networkLayer.loginWithcredentials(username, password)
.doOnNext(new Action1<Response<Void>>() {
@Override
public void call(Response<Void> voidResponse) {
if (saveUsername) {
databaseLayer.saveUsername(username).subscribe();
} else {
databaseLayer.saveUsername(null).subscribe();
}
}
})
.cache();
}
mSubscription = retainedObservable.subscribeOn().observeOn().subscribe(subscriber);
return retainedObservable;
}
如果设备在登录完成之前完成配置更改,我希望能够重新订阅正在运行的可观察对象,这样我就不必要求用户重新输入他们的凭据按下登录按钮再次。
为了实现这一点,我最初调用doLogin(...)并将返回的observable临时保存在数据持有者类中。如果设备经历了配置更改,我可以从数据持有者类中获取已创建的observable并重新订阅它。这很好用,我唯一挂断的是我还需要暂时保存用户名,密码和saveUsername标志。这很容易做到,但是我想知道是否有一种方法可以利用RxJava在Observable中保存这些值,并且当我在doOnNext(...)中需要它们时仍然可以访问它们。如果我不这样做并且只是重新订阅Observable,那么当doOnNext(...)运行时,我不会拥有saveUsername标志的值或明显不好的用户名。
只需保留Observable并以某种方式保留用户名,密码和saveUsername标志,这将是非常好的。有没有办法在RxJava中实现这一点,或者我是否正在按照需要的方式完成它,如果我希望在配置更改期间保留这些变量?
答案 0 :(得分:1)
基本上,是的。 RxJava使用一个功能无状态的API,所以除了它返回的值之外,你不能(或者假设)将附加数据附加到一个observable。
与功能语言一样,通常有两种方法可以解决这个问题: