Spec-Zone.ru › Kotlin 1.8

Отладка Kotlin Flow с помощью IntelliJ IDEA – учебное пособие

В этом руководстве показано, как создать Kotlin Flow и отладить его с помощью IntelliJ IDEA.

В руководстве предполагается, что у вас есть предварительные знания о корутинам и Kotlin Flow.

Создание Kotlin flow

Создайте Kotlin flow с медленным эмиттером и медленным коллектором:

  1. Откройте Kotlin-проект в IntelliJ IDEA. Если у вас нет проекта, создайте его.

  2. Чтобы использовать библиотеку kotlinx.coroutines в проекте Gradle, добавьте следующую зависимость в build.gradle(.kts):

    dependencies {
        implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4")
    }
    
    dependencies {
        implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4'
    }
    

    Для других систем сборки см. инструкции в kotlinx.coroutines README.

  3. Откройте файл Main.kt в src/main/kotlin.

    Папка src содержит Kotlin-исходные файлы и ресурсы. Файл Main.kt содержит пример кода, который будет выводить Hello World!.

  4. Создайте функцию simple(), которая возвращает поток из трёх чисел:

    • Используйте функцию delay(), чтобы имитировать ресурсоёмкий код блокировки ЦП. Она приостанавливает корутину на 100 мс без блокировки потока.

    • Произведите значения в цикле for с помощью функции emit().

    import kotlinx.coroutines.*
    import kotlinx.coroutines.flow.*
    import kotlin.system.*
    
    fun simple(): Flow<Int> = flow {
        for (i in 1..3) {
            delay(100)
            emit(i)
        }
    }
    
  5. Измените код в функции main():

    • Используйте блок runBlocking() для обертывания корутины.

    • Соберите изменённые значения с помощью функции collect().

    • Используйте функцию delay() для имитации ресурсоёмкого кода. Она приостанавливает корутину на 300 мс без блокировки потока.

    • Выведите собранное значение из потока с помощью функции println().

    fun main() = runBlocking {
        simple()
            .collect { value ->
                delay(300)
                println(value)
            }
    }
    
  6. Соберите код, нажав Собрать проект.

    Build an application

Отладка корутины

  1. Установите точку останова в строке, где вызывается функция emit():

    Build a console application
  2. Запустите код в режиме отладки, нажав Отладка рядом с конфигурацией запуска в верхней части экрана.

    Build a console application

    Открывается окно инструментов Отладка:

    • Вкладка Фреймы содержит стек вызовов.

    • Вкладка Переменные содержит переменные в текущем контексте. Она показывает, что поток выдает первое значение.

    • Вкладка Корутины содержит информацию о работающих или приостановленных корутинах.

    Debug the coroutine
  3. Возобновите сеанс отладки, нажав Возобновить программу в окне инструментов Отладка. Программа остановится на той же точке останова.

    Debug the coroutine

    Теперь поток выдает второе значение.

    Debug the coroutine

Оптимизированные переменные

Если вы используете suspend функции, в отладчике рядом с именем переменной может отображаться текст «была оптимизирована»:

Variable "a" was optimized out

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

Никогда не используйте этот флаг в продакшене: -Xdebug может приводить к утечкам памяти.

Добавление одновременно выполняющейся корутины

  1. Откройте файл Main.kt в src/main/kotlin.

  2. Улучшите код для одновременного выполнения эмиттера и коллектора:

    • Добавьте вызов функции buffer() для одновременного выполнения эмиттера и коллектора. buffer() сохраняет изменённые значения и запускает коллектор потока в отдельной корутине.

    fun main() = runBlocking<Unit> {
        simple()
            .buffer()
            .collect { value ->
                delay(300)
                println(value)
            }
    }
    
  3. Соберите код, нажав Собрать проект.

Отладка Kotlin flow с двумя корутинами

  1. Установите новую точку останова в println(value).

  2. Запустите код в режиме отладки, нажав Отладка рядом с конфигурацией запуска в верхней части экрана.

    Build a console application

    Открывается окно инструментов Отладка.

    На вкладке Корутины вы можете увидеть, что две корутины выполняются одновременно. Коллектор и эмиттер потока выполняются в отдельных корутинах из-за функции buffer() . Функция buffer() буферизует испускаемые значения из потока. Корутина эмиттера имеет статус ВЫПОЛНЯЕТСЯ, а корутина коллектора имеет статус ПРИОСТАНОВЛЕНА.

  3. Возобновите сеанс отладки, нажав Возобновить программу в окне инструментов Отладка.

    Debugging coroutines

    Теперь корутина коллектора имеет статус ВЫПОЛНЯЕТСЯ, а корутина эмиттера имеет статус ПРИОСТАНОВЛЕНА.

    Вы можете углубиться в каждую корутину для отладки вашего кода.

Последнее изменение: 10 января 2023
Отладка корутин с помощью IntelliJ IDEA – учебное пособие Сериализация

© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/debug-flow-with-idea.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API