繁体   English   中英

如何使用RxBinding,RxJava和Retrofit实现自动完成

[英]How to implement autocomplete with RxBinding, RxJava, and Retrofit

我是RxJava的新手,那里有很多示例和答案,但是我很难将一些可以解决我所有问题的东西拼凑在一起。

下面的代码似乎可以正常工作,除了我偶尔会得到混乱的结果。 所以我想我需要介绍一个switchMap,但是我不确定确切的位置,我想知道是否还没有使事情变得不必要地复杂,比如订阅RxBinding和单独订阅网络调用是否很奇怪?

view.autocompleteText()是一个RxBinding。 我想从中获取文本,调用改造服务,并用结果更新视图,并显示和隐藏微调框,并进行网络调用的错误处理,这不会杀死整件事并使我文本框无响应。

private void handleAutocompleteText() {
    mCompositeDisposable.add(view.autocompleteText()
        .debounce(400, TimeUnit.MILLISECONDS)
        .filter(s -> s.length() >= resources.getAutocompleteThreshold())
        .observeOn(threads.main())
        .doOnNext(s -> view.setProgressVisible(true))
        .subscribe(s -> {
            mCompositeDisposable.add(mAutocompleteService.query(s.toString())
                .subscribeOn(threads.io())
                .observeOn(threads.main()).toObservable()
                .retry(3)
                .doOnNext(response -> {
                    if (response.getStatus() != 200)
                        throw new RuntimeException("Server error " + response.getStatus());
                })
                .map(response -> response.getData())
                .subscribe(items -> {
                    view.setProgressVisible(false);
                    view.updateList(items);
                }, error -> {
                    view.setProgressVisible(false);
                    view.showMessage(resources.getListError());
                }));
            }, error -> {
                view.setProgressVisible(false);
                view.showMessage(resources.getListError());
            }
        )
    );
}

有没有更好的方法可以做到这一点,我在哪里可以引入switchMap来放弃进行中的搜索,而仅使用最后一个的结果更新视图? 如果答案截然不同,我将不胜感激。

提前致谢!!

我不确定这是您想要的。 但这可能会给您提示和解决方案。 让我们看一下代码。 switchMap从视图获取参数并将observable resrofit observable更改为observable resrofit observable 然后返回API call响应。 完成所有操作后,您可以收到响应并使用响应。

如果代码不起作用,请通知我。

mCompositeDisposable.add(
        view
                .autocompleteText()
                .debounce(400, TimeUnit.MILLISECONDS)
                .filter({ s -> s.length() >= resources.getAutocompleteThreshold() })
                .observeOn(threads.main())
                .doOnNext({ s -> view.setProgressVisible(true) })
                .map({ s -> s.toString())}
                .switchMap({ text -> mAutocompleteService.query(text))}
                .subscribeOn(threads.io())
                .observeOn(threads.main())
                .retry(3)
                .doOnNext({ response ->
                    if (response.getStatus() !== 200)
                        throw RuntimeException("Server error " + response.getStatus())
                })
                .map({ response -> response.getData() })
                .subscribe({ items ->
                    view.setProgressVisible(false)
                    view.updateList(items)
                }, { error ->
                    view.setProgressVisible(false)
                    view.showMessage(resources.getListError())
                })
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM