Корутины в Android
Что такое корутины?
Сопрограммы помогают управлять длительными задачами, которые в противном случае могут заблокировать основной поток и привести к тому, что ваше приложение перестанет отвечать на запросы. Сопрограмма — это шаблон проектирования параллелизма, который можно использовать в Android для упрощения кода, выполняемого асинхронно.
Как вы видите на диаграмме выше, в вашем основном потоке вы можете выполнять только небольшие операции. Если вы хотите выполнять длительные операции в своем основном потоке, ваше приложение может давать сбои и работать медленно. Или если вы создадите нет. фонового/рабочего потока, то возникает проблема с нехваткой памяти. Сопрограммы — это особый тип функций, которые преднамеренно передают контроль вызывающей стороне, но не завершают свой контекст в процессе, вместо этого сохраняя его в состоянии ожидания.
Как использовать корутины?
dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:x.x.x"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:x.x.x"
}
- Main: использует поток пользовательского интерфейса. В Rx аналогично AndroidSchedulers.MainThread()
- По умолчанию: используется для задач с интенсивным использованием ЦП . Он будет использовать столько потоков, сколько доступно ядер ЦП. Поскольку это задачи с интенсивным использованием ЦП, нет смысла запускать много потоков, так как ЦП будет загружен. Подобно Schedulers.computation() в Rx.
- IO: используется для ввода/вывода. Выполнение запроса к API, доступ к БД и т. д. Аналогично Schedulers.io() в Rx.
- Работа: По сути, это задача, которая выполняется в фоновом режиме, и ее можно интерпретировать как действие с жизненным циклом, который уничтожается после завершения.
- Для выполнения различных операций с использованием заданий: Job.join
- Для отмены всех дочерних заданий: Job.cancel
- withContext: еще один способ написания асинхронного кода, при котором нам не нужно писать await().
suspend fun fetchUser() = withContext(Dispatchers.IO) {
// make network call
// return
}
Suspend : как следует из их названия, это функции, которые приостанавливают выполнение сопрограммы в какой-то момент, а затем снова возобновляют выполнение функции, когда результат готов.
suspend fun makeNetworkRequest() {
// fetchData is another suspend function, so 'makeNetworkRequest' is going to be `suspended`
// until it's result becomes available, without blocking the main thread.
val result = fetchData()
// continues executing once the result becomes available
show(result)
}
// fetchData is main thread safe
suspend fun fetchData(): Result { ... }
Запуск не заблокирует основной поток, но, с другой стороны, выполнение остальной части кода не будет ждать результата запуска, так как запуск не является вызовом приостановки.
fun GFG()
{
var resultOne = "Android"
var resultTwo = "Kotlin"
Log.i("Launch", "Before")
launch(Dispatchers.IO) { resultOne = function1() }
launch(Dispatchers.IO) { resultTwo = function2() }
Log.i("Launch", "After")
val resultText = resultOne + resultTwo
Log.i("Launch", resultText)
}
suspend fun function1(): String
{
delay(1000L)
val message = "function1"
Log.i("Launch", message)
return message
}
suspend fun function2(): String
{
delay(100L)
val message = "function2"
Log.i("Launch", message)
return message
}
Async также используется для запуска сопрограмм, но он блокирует основной поток в точке входа функции await() в программе.
fun GFG
{
Log.i("Async", "Before")
val resultOne = Async(Dispatchers.IO) { function1() }
val resultTwo = Async(Dispatchers.IO) { function2() }
Log.i("Async", "After")
val resultText = resultOne.await() + resultTwo.await()
Log.i("Async", resultText)
}
suspend fun function1(): String
{
delay(1000L)
val message = "function1"
Log.i("Async", message)
return message
}
suspend fun function2(): String
{
delay(100L)
val message = "function2"
Log.i("Async", message)
return message
}
Преимущества использования сопрограмм
- Сопрограммы — это легковесные потоки
- Корутины могут работать параллельно, ждать друг друга и общаться друг с другом.
- Создавайте тысячи сопрограмм без проблем с памятью
- Лучшее для современных приложений

![В любом случае, что такое связанный список? [Часть 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































