我正在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()
,标记为最终
。然后,在您的匿名嵌套类中,您显式引用这些值,“关闭”它们。生成的可观察链具有操作所需的所有绑定。
再次订阅可观察将使用原始用户名/密码/保存标志。
是否有任何方法可以将一些值设置或放入中? 我们正在使用以下版本的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后将响应存储为对象,这样我就可以使用该对象验证一些数据,如状态代码、正文、标题等。 我试着使用但它只允许存储字符串,如果将响应存储为类似字符串的并尝试检索