[英]AutoCompleteTextView with Retrofit 2, RxJava and RxBinding
[英]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.