У моего приложения есть SearchView. Когда пользователь вводит в SearchView, onQueryTextChange передает запрос ведущему, а затем вызывает API. Я использую Retrofit и RxJava для вызовов. Вызовы возвращают json-файл со словами, содержащими то, что пользователь набрал до сих пор. Проблема заключается в том, что если пользователь быстро набирает буквы, а сеть работает медленно, иногда SearchView не отображает результаты на основе всех введенных букв, но, возможно, до второго, потому что последний вызов был быстрее, чтобы получить результаты по сравнению со вторым последним.синхронные звонки с rxjava Android
Пример: начало пользователь набрав:
"Коу" -> сделать вызов к API (сначала вызвать после 3-х букв) -> начать возвращаться д значения
"п" -> сделать звоните -> начать возвращать значения
"т" -> сделать вызов -> начать возвращать значения
"г" -> сделать вызов (соединение медленное)
«у» -> сделать вызов -> начать возвращать значения
-> «г» получить результаты, наконец, и возвращает их
public Observable<List<MyModel>> getValues(String query) {
return Observable.defer(() -> mNetworkService.getAPI()
.getValues(query)
.retry(2)
.onErrorReturn(e -> new ArrayList<>()));
}
вызов очень прост и всякий раз, когда я получаю I ошибки не хотят ничего показывать.
Есть ли способ решить это? Или, возможно, это не так, чтобы использовать реактивное программирование?
EDIT: Просто, чтобы сделать более ясным, поток выглядит следующим образом:
Деятельность, которая использует вид пользовательского поиска (https://github.com/Mauker1/MaterialSearchView)
обычай SearchView имеет слушателя, когда пользователь начинает печатать. После того, как пользователь начнет вводить операцию, вызов вызывает презентатор.
ведущий подпишется наблюдаемым возвращаемый интерактора:
Ведущий:
addSubscription(mInteractor.getValues(query)
.observeOn(mMainScheduler)
.subscribeOn(mIoScheduler)
.subscribe(data -> {
getMvpView().showValues(data);
}, e -> {
Log.e(TAG, e.getMessage());
}));
Interactor:
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 или, может быть, я должен использовать обработчик o г что-то подобное (но по-прежнему изо всех сил, как вписать его в моей архитектуры)
Интересный RxBinding. Я попробую, и я дам вам знать. Я пробовал уже дебютировать, но по некоторым причинам это не сработало. Может, я сделал что-то не так. Сегодня я попробую еще раз. Спасибо! – user1341300
Я не думаю, что могу использовать RxBinding. Я пробовал несколько вещей с ним, но это выглядит круто, но на данный момент я использую пользовательский поиск (это расширенный макет координатора с текстом редактирования, взятым из https://github.com/Mauker1/MaterialSearchView). – user1341300
Затем используйте 'RxTextView.textChanges()' с 'switchMap()' – EpicPandaForce