【发布时间】:2017-01-19 01:55:19
【问题描述】:
我在一个 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;
}
如果设备在登录完成之前经历了配置更改,我希望能够重新订阅正在运行的 observable,这样我就不必要求用户重新输入他们的凭据以再次按下登录按钮。
为了实现这一点,我最初调用 doLogin(...) 并将返回的 observable 临时保存在数据持有者类中。如果设备经历了配置更改,我可以从数据持有者类中获取已经创建的 observable 并重新订阅它。这很好用,我唯一的挂断是我还需要暂时保存用户名、密码和 saveUsername 标志。这很容易做到,但是我想知道是否有一种方法可以利用 RxJava 将这些值保存在 Observable 中,并且当我在 doOnNext(...) 中需要它们时仍然可以访问它们。如果我不这样做而只是重新订阅 Observable,那么当 doOnNext(...) 运行时,我将没有 saveUsername 标志或显然不好的用户名的值。
如果只需要保留 Observable 并以某种方式保留用户名、密码和 saveUsername 标志,那就太好了。有没有办法在 RxJava 中实现这一点,或者如果我希望在配置更改期间保留这些变量,我目前正在这样做的方式是否需要这样做?
【问题讨论】:
-
retainedObservable 和 cachedObservable 应该是一样的吗?目前 reservedObservable 实际上似乎没有用于任何事情
-
好收获。我转移它时出错了。现已修复。