Я использую RxBinding в своем текущем приложении для Android и хочу реализовать функцию текстового поиска.
Мой код выглядит следующим образом: -
compositeDisposable.add(RxTextView.textChangeEvents(searchEditText)
.skipInitialValue()
.subscribeOn(Schedulers.io())
.debounce(200, TimeUnit.MILLISECONDS)
.filter(textViewTextChangeEvent -> (textViewTextChangeEvent.text().length() == 0 || textViewTextChangeEvent.text().length() > 2))
.map(event -> event.text().toString())
.distinct()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(charactersResponse -> {
articlesLiveData = viewModel.textSearch(charactersResponse);
textLiveData.removeObserver(TextFragment.this);
textLiveData.observe(TextFragment.this, TextFragment.this);
}));
Я хочу искать только отдельные значения, однако приведенный выше код создает повторяющиеся поисковые запросы.
Почему не удаляются отдельные повторяющиеся строки?
Например, когда я набираю "чилийский" в тексте поиска EditText
мой код поиска вызывается со следующими строками
chi
chi
chil
chil
chil
chile
chile
chilea
chilean
chilean
Что я делаю неправильно?
это во фрагменте, onViewCreated. Какая разница, где я это установил? все работает, как требуется, кроме отличного (), не имеющего никакого эффекта. @ d370urn3ur
Без дополнительного контекста я не могу быть уверен, но похоже, что подписка была сделана дважды. Вы сказали, что поместили этот код в Fragment::onViewCreated
, так что, может быть, вы загружаете другой фрагмент, а затем возвращаетесь к нему, не избавляясь от первой подписки? Вы можете поставить точку останова, где вы делаете подписку, чтобы увидеть, вызывается ли она дважды. Если он вызывается только один раз, и у вас все еще есть эта проблема, мне нужно будет увидеть больше вашего кода, чтобы диагностировать ее.
Когда я копирую ваш код в Activity :: onCreate, он работает должным образом. Итак, первое, что вы можете сделать, это убедиться, что вы удаляете свой композитный объект в Fragment :: onDestroyView. Это должно решить проблему множественной эмиссии.
Теперь у вас возникнет другая проблема: вы используете distinct()
, но я сомневаюсь, что это то, что вам нужно от панели поиска. Distinct будет фильтровать ВСЕ неуникальные значения за время существования наблюдаемого. Итак, как только он выпустил «чили», если вы продолжите вводить «чилийский», а затем стереть «ан», вы больше никогда не увидите «чили». Вероятно, вам нужен distinctUntilChanged()
, который просто отфильтровывает неуникальные совпадения с ПОСЛЕДНИМ переданным значением.
Хорошее место, я действительно несколько раз привязывал текст редактирования поиска. теперь, когда я связываю только после того, как моя дублирующая проблема будет решена. Одна вещь, которую я заметил: как только у меня .distinct () и .distinctUntilChanged () работали должным образом, я сгенерировал много «Хореограф: пропущено 53 кадра! Приложение может слишком много работать над своим основным потоком». предупреждение, хотя у меня был .subscribeOn (Schedulers.computation ()) @ d370urn3ur
Фрагмент или активность? Каким способом вы оформляете эту подписку? onCreate? onStart? onViewCreated?