Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在配置更改期间使用RxJava临时保存变量_Android_Rx Java - Fatal编程技术网

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

Android 在配置更改期间使用RxJava临时保存变量,android,rx-java,Android,Rx Java,我在一个Android项目上使用RxJava,希望确保我正确地实现了一些东西 我正在使用Observable登录到服务器。登录后,我可能希望在客户端保存用户名,因此我使用doOnNext操作符来完成此操作。下面是一个这样的示例: Observable<Response<Void>> doLogin(Observable<Response<Void>> retainedObservable, Subscriber subscriber, String

我在一个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,这样我就不必要求用户重新输入他们的凭据,再次按下登录按钮

为了实现这一点,我最初称之为多洛金。。。并将返回的可观测数据临时保存在数据持有者类中。如果设备经历了配置更改,我可以从数据持有者类中获取已经创建的可观察对象并重新订阅。这很好,我唯一的问题是我还需要暂时保存用户名、密码和saveUsername标志。这很容易做到,但是我想知道是否有一种方法可以利用RxJava在Observable中保存这些值,并且在doOnNext中需要它们时仍然可以访问它们。。。。如果我不这样做,只是重新订阅可观察的,那么当doOnNext。。。运行时,我将没有saveUsername标志或用户名的值,这显然是错误的


如果只需要保留可观察对象,并以某种方式保留用户名、密码和saveUsername标志,那就太好了。如果我希望在配置更改期间保留这些变量,那么有没有办法在RxJava中实现这一点,或者我目前的做法是否需要这样做?

基本上是这样的。RxJava使用一个功能性的、无状态的API,因此除了它返回的值之外,您实际上不能或不应该向可观察对象附加额外的数据

与函数式语言一样,通常有两种方法:

您可以在闭包中捕获其他值,类似于 你现在正在做。但显然,这些价值观只会 在所述闭包的范围内可访问,因此不能返回 可以从方法中观察到,并且仍然可以访问用于 以后再创建它。 如果以后确实需要访问该数据,通常的方法是创建某种包含所有数据的结果对象。例如,LoginResult类,它包含您的响应以及原始登录数据。
retainedObservable和cachedObservable应该是相同的吗?目前retainedObservable实际上似乎并没有用于任何好的捕获。我把它调错了。现在修好了。