Когда дело доходит до многопоточности, обработка ошибок может стать кошмаром. Но в RxJava 2 это было бы проще простого.

В моем последнем блоге я рассказал о том, что RxJava 2 делает многопоточность настолько простой. Но я не касался того, как он будет обрабатывать ошибки. Итак, позвольте мне попытаться рассказать об этом здесь…

Ошибка может произойти где угодно!!

Как упоминалось в предыдущем блоге, мы могли рассматривать код RxJava 2 как цепочку кодов, которые можно разделить на 3 категории: Производитель, Операторы и Потребитель.

И знаешь, что? Ошибка может произойти где угодно в этой цепочке!

Как с этим можно было справиться?

Подписка приходит на помощь

Как упоминалось в моем первом учебном блоге по RxJava 2, мы используем subscribe как часть создания Consumer части RxJava 2. То, что было показано ниже.

Single.just(getSomeData()).subscribe{ it -> print(it) }

Однако, когда у нас есть single, мы можем предоставить более одной лямбды, как показано ниже.

Single.just(getSomeData())
    .subscribe({ /*onSuccess*/ }, { /*onError*/ })

Первый — захват, когда результат готов. Второй - захватить, когда происходит ошибка. Таким образом, в любом месте цепочки, если есть ошибка, она будет зафиксирована здесь.

Ниже показан пример, где в случае успеха распечатайте результат. При возникновении ошибки распечатайте сообщение об ошибке.

Single.just(getSomeData())
    .subscribe(
        { result -> println(result) }, 
        { error -> println(error.localizedMessage) }
    )

Все ошибки будут зафиксированы в этом единственном месте. Разве это не приятно!! 🤩

Еще немного о подписке

Здесь мы сообщаем, что subscribe может принимать состояния onSuccess и onError. Есть только 2 возможных состояния, так как мы используем Single, где есть только один поток данных. Как только поток данных через него завершен.

Однако у нас также есть Observable, как показано в моем предыдущем блоге. Они могли бы обеспечить поток данных. Таким образом, несмотря на то, что данные передаются в onSuccess, это еще не все. Может быть больше данных.

Следовательно, чтобы точно знать, что данные завершены, subscribe для Observable действительно принимает 3 лямбда, то есть onSuccess, onError и onComplete. Код, как показано ниже

getObservableOfInts().subscribe(
                   { println(it) },                  // onSuccess
                   { println(it.localizedMessage) }, // onError
                   { println("Completed") })         // onCompleted

Это позволяет проверить полное состояние цепочки RxJava 2.

Почему мы говорим о полном состоянии? Разве мы не говорим об ошибке?

Да, мы изучаем обработку ошибок, но я должен рассказать вам о 3 возможных состояниях onSuccess, onError и onComplete, чтобы вы знаете, что произойдет, если в любом из них произойдет ошибка исключения.

Как показано на диаграмме ниже, 3 возможных состояния могут иметь ошибку.

Только когда ошибка исключения возникает в состоянии onSuccess😎, ошибка по-прежнему фиксируется в состоянии onError.

Если ошибка исключения возникает в onError😱 или onComplete😱, ошибка не будет зафиксирована. В этой ситуации необходим внешний перехват ошибок. Но в большинстве случаев onError и onComplete не вылетают, так как код здесь обычно проще.

Подробнее об обработке ошибок в RxJava см. ниже.



Что ж, похоже, мы легко справимся с ошибкой. Но подождите… а если ошибки нет, а задачу нужно отменить до ее завершения… как мы можем это сделать? … Проверьте ниже



Я надеюсь, что этот пост будет полезен для вас. Вы можете ознакомиться с другими моими интересными темами здесь.

Следуйте за мной в medium, Twitter, Facebook или Reddit, чтобы получать небольшие советы и обучение на Android, Kotlin и т. д. по смежным темам. ~Элье~