当前位置: 首页 > 知识库问答 >
问题:

将变量“放入”RxJava链以供以后使用

宋成天
2023-03-14

我正在Android上使用RxJava来执行登录操作。

我需要传入用户名、密码和布尔标志。用户名和密码并发送到服务器进行验证,一旦返回响应,我需要使用该标志来确定下一步要做什么。

由于登录操作是异步的,所以我希望确保当响应返回时,我仍然可以访问我在开始时传入的用户名、密码和标志。

以下是我认为存在问题的最初编码方式:

    public Observable<Result> execute1(final String username, final String password, final boolean shouldSaveUsername) {
    return mLoginNetwork
            .loginWithCredentials(username, password)
            .map(new Func1<Response<Void>, LoginObject>() {
                @Override
                public LoginObject call(Response<Void> response) {
                    if (!response.isSuccessful()) {
                        Exceptions.propagate(new HttpException(response));
                    }

                    return new LoginObject(username, password, shouldSaveUsername);
                }
            })
            .doOnNext(new Action1<LoginObject>() {
                @Override
                public void call(LoginObject loginObject) {
                    if (loginObject.shouldSaveUsername) {
                        saveUsername(username);
                    }
                }
            })
            .flatMap(new Func1<Entitlement, Observable<Result>>() {
                @Override
                public Observable<Result> call(LoginObject loginObject) {
                    return mNetwork
                            .fetchSomething();
                }
            });
}

当我调用ecute1()时,它会返回一个可观察的,我将其缓存然后订阅。如果发生Android配置更改,我会取消订阅可观察的,但将其保存在缓存中。配置更改完成后,我会将可观察的从缓存中取出并重新订阅它。当我重新订阅时,需要再次进行loginSus凭据调用,但当它返回时,用户名、密码和布尔标志将不再存在,因此我将无法在我的链中使用它们,这是一个问题。

那么,如何解决这个问题呢?

我需要一种方法,使可观察对象的输入数据成为可观察对象的一部分,以便在缓存可观察对象时,也会缓存输入数据。

以下是建议的解决方案:

    public Observable<Result> execute2(String username, String password, boolean shouldSaveUsername) {
    return Observable
            .just(new LoginData(username, password, shouldSaveUsername))
            .flatMap(new Func1<LoginData, Observable<LoginData>>() {
                @Override
                public Observable<?> call(final LoginData loginData) {
                    return mLoginNetwork
                            .loginWithCredentials(loginData.getUsername(), loginData.getPassword())
                            .map(new Func1<Response<Void>, LoginData>() {
                                @Override
                                public LoginData call(Response<Void> response) {
                                    if (!response.isSuccessful()) {
                                        Exceptions.propagate(new HttpException(response));
                                    }
                                    return loginData;
                                }
                            });
                }
            })
            .doOnNext(new Action1<LoginData>() {
                @Override
                public void call(LoginData loginData) {
                    if (loginData.shouldSaveUsername) {
                        saveUsername(username);
                    }
                }
            })
            .flatMap(new Func1<LoginData, Observable<Result>>() {
                @Override
                public Observable<Result> call(LoginData loginData) {
                    return mNetwork
                            .fetchSomething();
                }
            });
}

我试图做的是通过使用Observable立即将输入数据作为流的一部分。just()将输入数据转换为可观察数据,然后让其他下游操作将其作为输入接收。我假设,如果我现在缓存可观察对象并稍后重新订阅,那么输入数据现在嵌入到我的可观察对象中,并且以后可以在任何操作符中访问。

我是否以“正常”的RxJava/功能性方式解决了我提出的解决方案中的问题?有没有更好的方法来解决这个问题?

共有1个答案

戚翰飞
2023-03-14

用户名/密码/保存标志作为参数传递给刽子手1(),标记为最终。然后,在您的匿名嵌套类中,您显式引用这些值,“关闭”它们。生成的可观察链具有操作所需的所有绑定。

再次订阅可观察将使用原始用户名/密码/保存标志。

 类似资料:
  • 是否有任何方法可以将一些值设置或放入中? 我们正在使用以下版本的Spring boot。 默认情况下,Spring 会将 加载到 中。我们可以@Autowired环境并获取String(“key”)来获取值。 假设我们有一个许可文件,将在< code > ApplicationContextInitializer 的< code>initialize()处对其进行解码以加载许可期,从而验证该系统是

  • 我正在为我的管道使用声明性语法,并希望存储在我的一个阶段上使用的工作区的路径,以便在以后的阶段可以使用相同的路径。 我已经看到我可以调用来获取当前目录,但是如何分配给要在阶段之间使用的变量? 编辑 我试图通过定义自己的自定义变量并在ws指令中使用like so来实现这一点: 在Jenkins构建控制台中,我看到这样的情况: 从第一阶段分配的原始工作空间实际上是 所以它看起来不起作用,我做错了什么?

  • 我正在使用ReactiveLocation库。基本上,我想在4秒内获得一个足够准确的位置。如果在此期间未收到足够精度的位置,但其他位置已返回最高精度的位置。 一旦接收到足够准确的位置,则返回该位置并完成可观测。 我会发布我正在尝试的代码。我可能,也可能,以错误的方式进行。

  • 问题内容: 我实质上是试图浏览html文件的文件夹。我想将它们嵌入到二进制文件中,并能够根据请求解析它们以用于模板执行目的。(如果我的措词不正确,请原谅)。 任何想法,技巧,窍门或实现此目的的更好方法将不胜感激。 问题答案: 我使用大多数Go Web应用程序执行此操作。我使用go-bindata从要嵌入的所有文件中自动生成Go源代码,然后将其编译为二进制文件。所有这些都是在构建过程中自动完成的。

  • 问题内容: 如何在代码后面创建可观察对象并生成下一个值?由于其他异步事件,我希望能够从代码的不同部分调用onNext。 这是我尝试过的,不起作用: 问题答案: 您需要的是某种主题。,,,等。 创建一个主题,然后可以订阅它。您也可以添加到流中。 例如: 一个更具体的用例(每次成功返回HTTP响应时,都会添加到可观察的流中): 正如另一位用户所说,如果您使用的是V5 ,请确保将所有设置都更改为。如果您

  • 我正在使用放心进行API测试自动化。我想在调用API后将响应存储为对象,这样我就可以使用该对象验证一些数据,如状态代码、正文、标题等。 我试着使用但它只允许存储字符串,如果将响应存储为类似字符串的并尝试检索