我的应用程序有一个SearchView。当用户键入SearchView时,onQueryTextChange将查询传递给演示者,然后调用API。我正在使用Retrofit和RxJava进行调用。调用返回一个json文件,其中包含用户目前键入的内容。问题在于,如果用户快速输入字母并且网络速度慢,则有时SearchView不会根据所有键入的字母显示结果,但可能直到倒数第二,因为最后一次调用可以更快地获得结果与第二个相比。
示例:用户开始输入:
“cou” - >调用API(3个字母后首次调用) - >开始返回值
“n” - >拨打电话 - >开始返回值
“t” - >拨打电话 - >开始返回值
“r” - >拨打电话(连接速度慢)
“y” - >拨打电话 - >开始返回值
- >“r”最终获得结果并返回它们
public Observable> getValues(String query) {
return Observable.defer(() -> mNetworkService.getAPI()
.getValues(query)
.retry(2)
.onErrorReturn(e -> new ArrayList<>()));
}
调用非常简单,每当我收到错误时,我都不想显示任何内容。
有办法解决这个问题吗?或者也许这不是使用反应式编程的情况?
编辑:为了更清楚,流程如下:
当用户开始键入时,自定义searchview具有侦听器。用户开始输入活动后,请调用Presenter。
演示者将订阅由交互者返回的观察者:
主持人:
addSubscription(mInteractor.getValues(query)
.observeOn(mMainScheduler)
.subscribeOn(mIoScheduler)
.subscribe(data -> {
getMvpView().showValues(data);
}, e -> {
Log.e(TAG, e.getMessage());
}));
交互器:
public Observable> getValues(String query) {
return Observable.defer(() -> mNetworkService.getAPI()
.getValues(query)
.debounce(2, TimeUnit.SECONDS)
.retry(2)
.onErrorReturn(e -> new ArrayList<>()));
所以现在要么在'普通'搜索视图中更改自定义搜索视图然后使用RxBinding,要么我应该使用处理程序或类似的东西(但仍然在如何适应我的架构)