如何使用 RxBinding、RxJava 和 Retrofit 实现自动完成
How to implement autocomplete with RxBinding, RxJava, and Retrofit
我是 RxJava 的新手,那里有很多示例和答案,但我无法拼凑出解决我所有问题的东西。
下面的代码似乎可以正常工作,只是我偶尔会得到乱序的结果。所以我想我需要引入一个 switchMap,但我不确定具体在哪里,我想知道我是否已经把事情变得不必要地复杂了,比如订阅 RxBinding 并单独订阅网络调用是不是很奇怪?
view.autocompleteText() 是一个 RxBinding。我想从中获取文本,调用改造服务,并用结果更新视图,所有花里胡哨的东西,如 showing/hiding 微调器,以及网络调用的错误处理,这不会破坏整个事情和让我的文本框没有反应。
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
。然后 returns 来自 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())
})
)
我是 RxJava 的新手,那里有很多示例和答案,但我无法拼凑出解决我所有问题的东西。
下面的代码似乎可以正常工作,只是我偶尔会得到乱序的结果。所以我想我需要引入一个 switchMap,但我不确定具体在哪里,我想知道我是否已经把事情变得不必要地复杂了,比如订阅 RxBinding 并单独订阅网络调用是不是很奇怪?
view.autocompleteText() 是一个 RxBinding。我想从中获取文本,调用改造服务,并用结果更新视图,所有花里胡哨的东西,如 showing/hiding 微调器,以及网络调用的错误处理,这不会破坏整个事情和让我的文本框没有反应。
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
。然后 returns 来自 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())
})
)