Я выяснил причину и некоторые возможные решения.
Давайте сначала начнем с причины.
Мой код можно упростить так: Observable # 1запускает n других Observables, которые выполняются в других потоках через flatMap()
.
. Для простоты давайте предположим, что все Observables выполняются в своем собственном потоке.Затем, когда одна наблюдаемая выдает ошибку, ошибка распространяется на все другие наблюдаемые и удаляет их.
Проблема заключается в том, что это распространение не синхронизировано (по-видимому, из-за соображений производительности).Из-за этого tryOnError()
может пройти проверку isDisposed()
, затем утилизироваться и затем вызвать ошибку.Это объясняет, почему исключение все еще возникает, даже если используется tryOnError()
.
Некоторые решения
В конце концов, после некоторых исследований и дискуссий, я пришел к двум основным решениям.
Один из способов - преобразовать все ошибки в результаты в Observables через onErrorReturn()
.Это решение работает, но может не подойти, если вы хотите остановить выполнение при появлении ошибки.
Другой способ - зарегистрировать глобальный обработчик ошибок и просто игнорировать эти ошибки.
Я пошел с последним решением, однако я не полностью удовлетворен.Мне бы очень хотелось, чтобы был способ зарегистрировать локальный обработчик ошибок.Например.есть метод на Observables, чтобы игнорировать ошибки, испускаемые после утилизации Observable
.
Ну хорошо.