Как избежать наблюдаемой остановки после onError

После onError моя наблюдаемая перестает работать. Как я могу этого избежать?

Вот мой наблюдаемый автозаполнение и код подписки:

public void subscribeAutoComplete() {
    autoSubscription = RxTextView.textChangeEvents(clearableEditText)
            .skip(1)
            .map(textViewTextChangeEvent -> textViewTextChangeEvent.text().toString())
            .filter(s -> s.length() > 2)
            .debounce(400, TimeUnit.MILLISECONDS)
            .flatMap(text -> autoCompleteService.getAutoCompleteTerms(text)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread()))
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<List<String>>() {
                @Override
                public void onCompleted() {
                    Log.d("rx", "oncomplete");
                }

                @Override
                public void onError(Throwable t) {
                    Log.e("rx", t.toString());
                }

                @Override
                public void onNext(List<String> strings) {

                    autoAdapter = new ArrayAdapter<>(MainActivity.this,
                                android.R.layout.simple_dropdown_item_1line, strings);
                    clearableEditText.setAdapter(autoAdapter);
                    clearableEditText.showDropDown();

                }
            });

    compositeSubscriptions.add(autoSubscription);
}

person Figen Güngör    schedule 20.12.2016    source источник
comment
Что именно вы хотите сделать, когда происходит ошибка?   -  person OneCricketeer    schedule 21.12.2016
comment
Просто пренебрегайте этим и двигайтесь дальше. Это автозаполнение. Например, когда нет сетевого подключения, вызывается onError и observable останавливается. Я хочу, чтобы он излучался, когда сетевое соединение вернулось.   -  person Figen Güngör    schedule 21.12.2016
comment
Я не слишком хорошо разбираюсь в RxJava, но звучит как retryWhen. github.com/ReactiveX/RxJava/wiki/Error-Handling-Operators   -  person OneCricketeer    schedule 21.12.2016
comment
Ах, да! Я пробовал оператор повтора ранее, но ожидал некоторых журналов onError и думал, что он не работает. Он просто не доходит до части onError. Когда я включал/выключал Wi-Fi, он работал как положено. Спасибо, @cricket_007   -  person Figen Güngör    schedule 21.12.2016
comment
Вы пробовали onErrorResumeNext()?   -  person Varundroid    schedule 21.12.2016
comment
Хм, что я должен написать внутри onErrorResumeNext, это требует Func или Observable, но что мне делать с этим, чтобы двигаться дальше (игнорировать и продолжать слушать) в случае ошибки? Кстати, я применил повторную попытку, и, похоже, она работает. Почему вы предлагаете мне использовать onErrorResumeNext() вместо retry()?   -  person Figen Güngör    schedule 21.12.2016


Ответы (2)


Это просто, просто игнорируйте ошибки:

autoCompleteService.getAutoCompleteTerms(text).onErrorResumeNext(Observable.empty())

Обратите внимание, что это потенциально опасно, так как вы будете игнорировать все ошибки; в этом случае это, вероятно, нормально, но будьте осторожны, чтобы не злоупотреблять этим.

person Tassos Bassoukos    schedule 21.12.2016
comment
Привет, @Tassos, спасибо, но мне кажется, что повторная попытка сработала. Это не перестает быть наблюдаемым. Можете ли вы сказать мне, почему я должен использовать onErrorResumeNext() вместо retry()? Или это просто альтернативное предложение? - person Figen Güngör; 22.12.2016
comment
Если вы добавите retryWhen после flatMap, он отменит подписку и повторно подпишется на исходный наблюдаемый объект, что означает, что вы потеряете 400-мс откат. - person Tassos Bassoukos; 23.12.2016
comment
Большое спасибо, @Tassos. - person Figen Güngör; 24.12.2016

Использование tryOnError работает для меня, и оно также вызовет ошибку внутри subscribe(), не получая UndeliverableException, приложение перестанет работать или потребует RxJavaPlugins.setErrorHandler, что затруднит обработку, связанную с пользовательским интерфейсом.

person Mihae Kheel    schedule 10.04.2021