说我想在用户按下按钮时从我的Android应用发送网络请求。 我正在使用RxJava,由于如果用户再次点击发送请求,我想取消上一个请求,则需要使用swithcMap,如下所示:
buttonClickObservable.map(e -> searchTextView.getText().toString())
.switchMap(searchText -> sendNetworkRequestToServer(searchText));
如果请求在服务器上处理几秒钟,同时用户再次单击该按钮,将会发生什么。据我了解,第一个可观察对象将被处置,并且将生成一个新的网络调用,但是服务器已经开始处理第一个可观察对象,所以我发现switchMap在这里没有帮助我吗?
答案 0 :(得分:0)
我认为您正在寻找的只是在请求进行中禁用按钮,并在请求完成或出错时启用它。
伪代码:
buttonClickObservable.map(e -> searchTextView.getText().toString())
.doOnNext(e -> buttonClickView.setEnabled(false))
.switchMap(searchText -> sendNetworkRequestToServer(searchText));
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
result -> ...,
error -> buttonClickView.setEnabled(true),
() -> buttonClickView.setEnabled(true)
)
但是,这种解决方案并不理想。我认为您正在寻找的是遵循MVI架构并正确管理状态。如果您有兴趣,可以观看以下精彩演讲:https://www.youtube.com/watch?v=0IKHxjkgop4