在配置更改期间使用RxJava临时保存变量

时间:2017-01-18 16:54:35

标签: android rx-java

我在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中实现这一点,或者我是否正在按照需要的方式完成它,如果我希望在配置更改期间保留这些变量?

1 个答案:

答案 0 :(得分:1)

基本上,是的。 RxJava使用一个功能无状态的API,所以除了它返回的值之外,你不能(或者假设)将附加数据附加到一个observable。

与功能语言一样,通常有两种方法可以解决这个问题:

  • 您可以在闭包中捕获其他值,类似于如何 你现在正在做但显然这些价值只会是 在所述封闭范围内可访问,因此您无法返回 从方法中观察并仍然访问用于的变量 稍后再创建。
  • 如果您确实需要稍后访问该数据,通常的方法是创建某种包含所有数据的结果对象。例如“LoginResult”类,它包含您的响应以及原始登录数据。