Android 在流中更新调用

Android 在流中更新调用,android,rx-java,observable,retrofit2,rx-java2,Android,Rx Java,Observable,Retrofit2,Rx Java2,我有一个编辑文本,允许用户输入用户名,输入用户名后,将值发送到数据库以检查用户名是否已存在,如果不存在,则允许进一步操作,否则将显示错误 到目前为止,这是我当前的代码 usernameObservable .skip(2) .debounce(800, TimeUnit.MILLISECONDS) .subscribe(username -> { Observable<Boolea

我有一个编辑文本,允许用户输入用户名,输入用户名后,将值发送到数据库以检查用户名是否已存在,如果不存在,则允许进一步操作,否则将显示错误

到目前为止,这是我当前的代码

usernameObservable
            .skip(2)
            .debounce(800, TimeUnit.MILLISECONDS)
            .subscribe(username -> {
                Observable<Boolean> observable = apiService.isAvailable(username);
                observable.observeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(aBoolean -> {

                        }, throwable -> {

                        });
            });
usernameObservable
.跳过(2)
.debounce(800,时间单位毫秒)
.订阅(用户名->{
Observable-Observable=apiService.isAvailable(用户名);
observable.observeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅(aBoolean->{
},可丢弃->{
});
});

目前,网络请求是在最后发出的,但是否可以在我收到数据之前发出请求,并且一旦我在流上执行一些其他操作。

您正在寻找
flatMap
操作员。它允许您将一个事件转换为另一个可观察事件,从而将排放转发到原始流。您的错误通知也将被转发

usernameObservable
        .skip(2)
        .debounce(800, TimeUnit.MILLISECONDS)
        .flatMap(username -> apiService.isAvailable(username))
        .subscribe(isAvailableResult -> {
            // react here
        }, throwable -> {
            // show an error here
        });

您正在寻找
flatMap
操作符。它允许您将一个事件转换为另一个可观察事件,从而将排放转发到原始流。您的错误通知也将被转发

usernameObservable
        .skip(2)
        .debounce(800, TimeUnit.MILLISECONDS)
        .flatMap(username -> apiService.isAvailable(username))
        .subscribe(isAvailableResult -> {
            // react here
        }, throwable -> {
            // show an error here
        });

是否可以在flatMap之后和subscribe之前添加其他操作符?例如,可能是一个过滤器,如果是的话,那么我从api调用接收到的数据会被处理吗,或者我的原始可观测数据会被操作吗?当然有可能:-)这就是Rx的美妙之处。。一旦应用flatMap操作符,它的每一项都将转换为可观察项。您在flatMap中定义的这些观测值发出的所有事件都将路由回原始流。因此,在flatMap之后,您将处理API端点的结果,该端点对应于您的方法调用apiService.isAvailable()。你可以用它们做任何你想做的事,这是一个固定的流程。然而,我知道我可能把你弄糊涂了。我没有在subscribe方法中重命名参数。。当然,它不再是用户名,而是isAvailable()端点的结果。我将编辑我的答案,在平面图之后,最后一个问题是,是否可以使用用户名以及api端点的结果?是的,它是:-。。由于Rx流是常见的,因此可以通过多种不同的方法实现所需的行为。。我想到的一个方法是简单地将isAvailable()端点的结果映射到一个具有相应用户名的Pair对象,如下所示:
apiService.isAvailable(username.map(result->Pair.create(username,result))
。。这样,subscribe方法中的参数将是一对结果和用户名。是否可以在flatMap之后和subscribe之前添加其他运算符?例如,可能是一个过滤器,如果是的话,那么我从api调用接收到的数据会被处理吗,或者我的原始可观测数据会被操作吗?当然有可能:-)这就是Rx的美妙之处。。一旦应用flatMap操作符,它的每一项都将转换为可观察项。您在flatMap中定义的这些观测值发出的所有事件都将路由回原始流。因此,在flatMap之后,您将处理API端点的结果,该端点对应于您的方法调用apiService.isAvailable()。你可以用它们做任何你想做的事,这是一个固定的流程。然而,我知道我可能把你弄糊涂了。我没有在subscribe方法中重命名参数。。当然,它不再是用户名,而是isAvailable()端点的结果。我将编辑我的答案,在平面图之后,最后一个问题是,是否可以使用用户名以及api端点的结果?是的,它是:-。。由于Rx流是常见的,因此可以通过多种不同的方法实现所需的行为。。我想到的一个方法是简单地将isAvailable()端点的结果映射到一个具有相应用户名的Pair对象,如下所示:
apiService.isAvailable(username.map(result->Pair.create(username,result))
。。这样,subscribe方法中的参数将与结果和用户名成对。。