【问题标题】:Using RxJava to temporarily save variables during configuration changes在配置更改期间使用 RxJava 临时保存变量
【发布时间】: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 实际上似乎没有用于任何事情
  • 好收获。我转移它时出错了。现已修复。

标签: android rx-java


【解决方案1】:

基本上,是的。 RxJava 使用功能性、无状态的 API,因此除了返回的值之外,您实际上无法(或不应该)将其他数据附加到可观察对象。

与函数式语言一样,通常有两种方法可以解决此问题:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-27
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多