Когда дело доходит до многопоточности, обработка ошибок может стать кошмаром. Но в 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 и т. д. по смежным темам. ~Элье~