У меня есть функция поиска в приложении для Android. SearchView имеет обратный вызов onSearchTextChanged(String oldQuery, String newQuery)
. Эта функция обратного вызова вызывает каждый раз, когда пользователь вводит любой текст в поле поиска. У меня есть вызов REST в этом обратном вызове, который запускается каждый раз, когда набирается каждое слово. Это приводит к нескольким вызовам REST. Я хочу этого избежать. Я просто хочу, чтобы только один экземпляр активен в то время, которое является последним, и все остальные вызовы должны быть немедленно отменены всякий раз, когда набирается новое письмо. Ниже приведены данные кода.Как остановить множественные переназначения при использовании с помощью Rx-Java, используемого в функции поиска для Android?
@Override
public void onSearchTextChanged(String oldQuery, String newQuery) {
floatingSearchView.showProgress();
moviesAPI.searchQuery(newQuery)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Search>() {
@Override
public void onCompleted() {
Log.d(TAG, "onCompleted() called");
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError() called with: e = [" + e + "]");
}
@Override
public void onNext(Search search) {
floatingSearchView.hideProgress();
floatingSearchView.swapSuggestions(search.getSearchResults());
Log.d(TAG, "onNext() called with: search = [" + search + "]");
}
}
);
}
Что делать, если вместо этого вы добавили несколько секунд после каждого символа, введенного для фактического начала запроса? Затем вы не отправляете для каждой буквы, когда пользователь вводит больше. –
Как указано в приведенном ниже ответе, вам, вероятно, нужен оператор debounce. Посмотрите @ https://github.com/ragdroid/rxify. Запустите приложение и найдите библиотеку, которая показывает поиск. – Raghunandan