Отладка Kotlin Flow с помощью IntelliJ IDEA – учебное пособие
В этом руководстве показано, как создать Kotlin Flow и отладить его с помощью IntelliJ IDEA.
В руководстве предполагается, что у вас есть предварительные знания о корутинам и Kotlin Flow.
Создание Kotlin flow
Создайте Kotlin flow с медленным эмиттером и медленным коллектором:
Откройте Kotlin-проект в IntelliJ IDEA. Если у вас нет проекта, создайте его.
-
Чтобы использовать библиотеку
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.coroutinesREADME. -
Откройте файл
Main.ktвsrc/main/kotlin.Папка
srcсодержит Kotlin-исходные файлы и ресурсы. ФайлMain.ktсодержит пример кода, который будет выводитьHello World!. -
Создайте функцию
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) } } -
Измените код в функции
main():Используйте блок
runBlocking()для обертывания корутины.Соберите изменённые значения с помощью функции
collect().Используйте функцию
delay()для имитации ресурсоёмкого кода. Она приостанавливает корутину на 300 мс без блокировки потока.Выведите собранное значение из потока с помощью функции
println().
fun main() = runBlocking { simple() .collect { value -> delay(300) println(value) } } -
Соберите код, нажав Собрать проект.

Отладка корутины
-
Установите точку останова в строке, где вызывается функция
emit():
-
Запустите код в режиме отладки, нажав Отладка рядом с конфигурацией запуска в верхней части экрана.

Открывается окно инструментов Отладка:
Вкладка Фреймы содержит стек вызовов.
Вкладка Переменные содержит переменные в текущем контексте. Она показывает, что поток выдает первое значение.
Вкладка Корутины содержит информацию о работающих или приостановленных корутинах.

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

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

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

Это означает, что срок жизни переменной был уменьшен, и переменная больше не существует. Отладка кода с оптимизированными переменными затруднена, поскольку вы не видите их значения. Вы можете отключить это поведение с помощью опции компилятора -Xdebug.
Добавление одновременно выполняющейся корутины
Откройте файл
Main.ktвsrc/main/kotlin.-
Улучшите код для одновременного выполнения эмиттера и коллектора:
Добавьте вызов функции
buffer()для одновременного выполнения эмиттера и коллектора.buffer()сохраняет изменённые значения и запускает коллектор потока в отдельной корутине.
fun main() = runBlocking<Unit> { simple() .buffer() .collect { value -> delay(300) println(value) } } Соберите код, нажав Собрать проект.
Отладка Kotlin flow с двумя корутинами
Установите новую точку останова в
println(value).-
Запустите код в режиме отладки, нажав Отладка рядом с конфигурацией запуска в верхней части экрана.

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

Теперь корутина коллектора имеет статус ВЫПОЛНЯЕТСЯ, а корутина эмиттера имеет статус ПРИОСТАНОВЛЕНА.
Вы можете углубиться в каждую корутину для отладки вашего кода.
© 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