【发布时间】:2017-01-14 05:48:59
【问题描述】:
我的应用有一个 SearchView。当用户在 SearchView 中键入时,onQueryTextChange 会将查询传递给演示者,然后它调用 API。我正在使用 Retrofit 和 RxJava 进行调用。这些调用返回一个 json 文件,其中包含用户迄今为止键入的内容。问题是,如果用户快速输入字母并且网络速度很慢,有时 SearchView 不会根据所有输入的字母显示结果,但可能会显示到倒数第二个,因为最后一次调用获得结果的速度更快与倒数第二个相比。
示例: 用户开始输入:
"cou" -> 调用 API(3 个字母后第一次调用)-> 开始返回值
"n" -> 拨打电话 -> 开始返回值
"t" -> 拨打电话 -> 开始返回值
"r" -> 拨打电话(连接慢)
"y" -> 拨打电话 -> 开始返回值
-> "r" 最终得到结果并返回它们
public Observable<List<MyModel>> getValues(String query) {
return Observable.defer(() -> mNetworkService.getAPI()
.getValues(query)
.retry(2)
.onErrorReturn(e -> new ArrayList<>()));
}
调用非常简单,每当我遇到错误时,我都不想显示任何内容。
有没有办法解决这个问题?或者也许这不是使用反应式编程的情况?
编辑: 为了更清楚,流程如下:
使用自定义搜索视图的活动 (https://github.com/Mauker1/MaterialSearchView)
当用户开始输入时,自定义搜索视图有一个监听器。一旦用户开始输入,Activity 就会调用 Presenter。
presenter 将订阅一个由交互器返回的 observable:
主持人:
addSubscription(mInteractor.getValues(query)
.observeOn(mMainScheduler)
.subscribeOn(mIoScheduler)
.subscribe(data -> {
getMvpView().showValues(data);
}, e -> {
Log.e(TAG, e.getMessage());
}));
交互者:
public Observable<List<MyModel>> getValues(String query) {
return Observable.defer(() -> mNetworkService.getAPI()
.getValues(query)
.debounce(2, TimeUnit.SECONDS)
.retry(2)
.onErrorReturn(e -> new ArrayList<>()));
所以现在我要么在“正常”搜索视图中更改自定义搜索视图,然后使用 RxBinding,要么我应该使用处理程序或类似的东西(但仍在努力如何将其适应我的架构)
【问题讨论】:
标签: android rx-java observable retrofit2 rx-android