Как обрабатывать отдельные значения с помощью RxBinding RxTextView.textChangeEvents

Я использую 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

Что я делаю неправильно?

Фрагмент или активность? Каким способом вы оформляете эту подписку? onCreate? onStart? onViewCreated?

d370urn3ur 29.10.2018 18:01

это во фрагменте, onViewCreated. Какая разница, где я это установил? все работает, как требуется, кроме отличного (), не имеющего никакого эффекта. @ d370urn3ur

Hector 29.10.2018 21:01
3
2
185
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Без дополнительного контекста я не могу быть уверен, но похоже, что подписка была сделана дважды. Вы сказали, что поместили этот код в Fragment::onViewCreated, так что, может быть, вы загружаете другой фрагмент, а затем возвращаетесь к нему, не избавляясь от первой подписки? Вы можете поставить точку останова, где вы делаете подписку, чтобы увидеть, вызывается ли она дважды. Если он вызывается только один раз, и у вас все еще есть эта проблема, мне нужно будет увидеть больше вашего кода, чтобы диагностировать ее.

Когда я копирую ваш код в Activity :: onCreate, он работает должным образом. Итак, первое, что вы можете сделать, это убедиться, что вы удаляете свой композитный объект в Fragment :: onDestroyView. Это должно решить проблему множественной эмиссии.

Теперь у вас возникнет другая проблема: вы используете distinct(), но я сомневаюсь, что это то, что вам нужно от панели поиска. Distinct будет фильтровать ВСЕ неуникальные значения за время существования наблюдаемого. Итак, как только он выпустил «чили», если вы продолжите вводить «чилийский», а затем стереть «ан», вы больше никогда не увидите «чили». Вероятно, вам нужен distinctUntilChanged(), который просто отфильтровывает неуникальные совпадения с ПОСЛЕДНИМ переданным значением.

Хорошее место, я действительно несколько раз привязывал текст редактирования поиска. теперь, когда я связываю только после того, как моя дублирующая проблема будет решена. Одна вещь, которую я заметил: как только у меня .distinct () и .distinctUntilChanged () работали должным образом, я сгенерировал много «Хореограф: пропущено 53 кадра! Приложение может слишком много работать над своим основным потоком». предупреждение, хотя у меня был .subscribeOn (Schedulers.computation ()) @ d370urn3ur

Hector 30.10.2018 13:03

Другие вопросы по теме