Использование runCatching и Result из стандартной библиотеки Kotlin

Вступление

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

Одно из моих приложений в магазине Google Play имеет платежный экран с несколькими платежными шлюзами. Пользователи могут производить оплату через любой шлюз. После оплаты появится всплывающее окно с подтверждением о статусе покупки.

Эта проблема кажется простой, со временем она усложняется, поскольку несколько шлюзов имеют несколько состояний. Это было решено нами с помощью запечатанных классов, это было четко объяснено в этой статье.

Не все проблемы имеют одинаковую сложность, простой сетевой запрос может иметь только два состояния, например успех или сбой. Вот где нам нужно простое решение, желательно стандартное решение из самого языка. Об этом мы и узнаем в этой статье.

Вкратце:
Проблема: Найдите простое решение для управления состоянием, которое не требует от нас создания новых вещей.
Решение: Используйте runCatching и его возможности с Result запечатанным классом в стандартной библиотеке Kotlin.

Предварительные требования

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

Результат и запуск

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

Результат

Результат - не что иное, как общий запечатанный класс, который мы обычно создаем в наших проектах для поддержки состояний. Но Result поставляется со стандартной библиотекой, нам не нужно писать собственные классы, удобно! Если вы хотите глубже изучить Результат, щелкните здесь. По сути, он служит для нас закрытым классом, предоставляя обратные вызовы onSuccess и onFailure.

runCatching

runCatching Вызывает указанный функциональный блок и возвращает его инкапсулированный результат, если вызов был успешным, перехватывая любое исключение Throwable, которое было сгенерировано при выполнении функции блока, и инкапсулируя его как сбой. Посмотри:

@InlineOnly
@SinceKotlin("1.3")
public inline fun <R> runCatching(block: () -> R): Result<R> {
    return try {
        Result.success(block())
    } catch (e: Throwable) {
        Result.failure(e)
    }
}

Решение

Теперь, когда у нас есть удобные функции, пора применить их. Наша проблема состоит в том, чтобы сделать сетевой запрос с простым управлением состоянием, используя Result и runCatching.

Мы узнаем, что runCatching принимает функцию функции Kotlin в качестве входных данных и возвращает результат в формате Result в зависимости от ее успешного состояния. В нашем случае блокировка - это сетевой запрос. Посмотри:

Разве это не так просто, никаких попыток / отловов для обработки ошибок, никакого ручного управления состоянием пользовательских классов. runCatching и Result предлагают больше, чем простое решение, о котором вы узнаете в следующем разделе.

Дополнительные преимущества

складывать

Одна из вещей, которые больше всего нравятся при использовании Result, - это встроенная функция fold, которая инкапсулирует успех и неудачу в качестве параметров и дает нам шанс получить согласованный тип возвращаемого значения. Взгляните на разные версии выполнения кода в разделе решения:

восстанавливаться

Встроенная функция расширения recover позволяет обрабатывать ошибку и восстанавливать ее с помощью резервного значения того же типа данных. См. Следующий пример.

Помимо этого, есть еще несколько интересных и удобных функций, таких как map, mapCatching, getOrDefault, getOrElse и другие. все о них читайте здесь.

runCatching как функция расширения

runCatching функция может действовать как общая функция расширения вместе с обычной встроенной функцией. Взгляните на синтаксис:

Благодаря этой возможности мы можем напрямую вызывать runCatching в сетевом запросе без необходимости делать это отдельно, что я лично предпочитаю, не обязательно обязательно (это больше похоже на личный интерес).

Бонус

Недавно я наткнулся на прекрасную статью, опубликованную Сатья Паван Кантамани о разработке под Android - ее настоятельно рекомендуется:



Это все. Надеюсь, вы узнали что-то полезное. Спасибо за прочтение!