← Назад к вопросам
Что возвращает launch?
1.0 Junior🔥 111 комментариев
#Многопоточность и асинхронность
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Launch - запуск корутин
launch - это функция, которая запускает новую корутину и возвращает объект Job. Это одна из самых частых функций при работе с coroutines в Kotlin.
Синтаксис
val job: Job = viewModelScope.launch {
// код корутины
val data = loadData()
updateUI(data)
}
// Job - это результат запуска корутины
Что возвращает launch
launch возвращает объект типа Job:
fun launch(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend () -> Unit
): Job
// Возвращаемое значение Job
val job = viewModelScope.launch {
delay(1000)
println("Done")
}
println(job) // Job(coroutine#1)
println(job.isActive) // true
Что такое Job?
Job - это объект, который представляет запущенную корутину. Через Job можно:
- Отменить корутину
- Проверить статус (active, completed)
- Дождаться завершения
- Обработать исключения
data class Job {
// Отмена корутины
fun cancel()
// Статус
val isActive: Boolean
val isCompleted: Boolean
val isCancelled: Boolean
// Ожидание завершения
suspend fun join()
// Обработка завершения
fun invokeOnCompletion(handler: (cause: Throwable?) -> Unit)
}
Примеры использования Job
1. Отмена корутины
val job = viewModelScope.launch {
repeat(100) { i ->
println("Iteration $i")
delay(1000)
}
}
// Позже отменяем
job.cancel()
// Корутина сразу остановится
2. Ожидание завершения
val job = viewModelScope.launch {
val data = loadDataFromNetwork()
updateUI(data)
}
// Ждём завершения (только в другой корутине)
launch {
job.join() // ждёт пока job завершится
println("Job completed")
}
3. Проверка статуса
val job = viewModelScope.launch {
delay(5000)
}
println(job.isActive) // true
println(job.isCompleted) // false
job.join()
println(job.isActive) // false
println(job.isCompleted) // true
4. Обработка завершения
val job = viewModelScope.launch {
try {
val data = loadData()
updateUI(data)
} catch (e: Exception) {
showError(e.message)
}
}
job.invokeOnCompletion { cause ->
if (cause == null) {
println("Job completed successfully")
} else {
println("Job failed: ${cause.message}")
}
}
Launch vs Async
// launch - не возвращает результат
val job: Job = viewModelScope.launch {
val data = loadData()
updateUI(data) // результат обрабатываем внутри
}
// async - возвращает результат через await()
val deferred: Deferred<String> = viewModelScope.async {
return@async loadData()
}
launch {
val result = deferred.await() // получаем результат
updateUI(result)
}
Практические примеры
1. Загрузка данных в ViewModel
class UserViewModel : ViewModel() {
private val _user = MutableLiveData<User?>()
val user: LiveData<User?> = _user
fun loadUser(id: Int) {
viewModelScope.launch {
try {
val userData = repository.getUser(id)
_user.value = userData
} catch (e: Exception) {
_user.value = null
}
}
}
// Job автоматически отменяется когда ViewModel очищается
}
2. Отмена при уничтожении Activity
class MainActivity : AppCompatActivity() {
private var searchJob: Job? = null
fun searchUsers(query: String) {
searchJob?.cancel() // отменяем старый поиск
searchJob = viewModelScope.launch {
val results = repository.search(query)
displayResults(results)
}
}
override fun onDestroy() {
super.onDestroy()
searchJob?.cancel() // отменяем при уничтожении
}
}
3. Параллельная работа с несколькими Job
launch {
val job1 = launch {
loadUserData()
}
val job2 = launch {
loadSettings()
}
job1.join() // ждём первую
job2.join() // ждём вторую
updateUI() // обновляем когда обе завершены
}
4. Контроль жизненного цикла
class MyService : Service() {
private val jobs = mutableListOf<Job>()
fun startWork() {
val job = lifecycleScope.launch {
while (isActive) { // продолжаем пока корутина активна
doWork()
delay(1000)
}
}
jobs.add(job)
}
override fun onDestroy() {
super.onDestroy()
n jobs.forEach { it.cancel() } // отменяем все
}
}
5. Обработка исключений в Job
val job = viewModelScope.launch {
try {
val data = loadData()
updateUI(data)
} catch (e: IOException) {
showNetworkError()
} catch (e: Exception) {
showGenericError(e)
}
}
job.invokeOnCompletion { exception ->
if (exception != null) {
Log.e("Job", "Error: ", exception)
}
}
Job иерархия (Parent-Child)
// viewModelScope имеет Job
val parentJob = viewModelScope.coroutineContext[Job]!!
val childJob = viewModelScope.launch {
println("Child job")
}
// Если отменить родителя, отменятся все дети
parentJob.cancel() // отменяет все launch в viewModelScope
Вывод
launch возвращает Job - объект для управления корутиной:
- cancel() - отмена
- isActive - проверка активности
- join() - ожидание завершения
- invokeOnCompletion() - обработка завершения
Job - это главный способ контролировать жизненный цикл корутин в Android.