Suspend function là hàm có thể tạm dừng mà không chặn thread, rồi chạy tiếp khi có kết quả.
Nó chỉ gọi được từ một coroutine hoặc từ một suspend function khác.
suspend fun loadUser(id: Int): User = withContext(Dispatchers.IO) {
api.getUser(id) // chạy trên thread IO
}
// Trong ViewModel
viewModelScope.launch {
val user = loadUser(1) // tạm dừng ở đây, main thread vẫn rảnh
_state.value = UiState(user)
}Cơ chế: compiler biến hàm suspend thành hàm nhận thêm một tham số ẩn Continuation (continuation-passing style) và chia thân hàm thành state machine theo các điểm tạm dừng. Tới điểm tạm dừng, hàm trả thread lại cho dispatcher; khi có kết quả, coroutine được resume đúng từ bước đó. Nhờ vậy code bất đồng bộ đọc tuần tự như code đồng bộ, không có callback lồng nhau.
Lưu ý: suspend không tự chuyển việc sang background thread. Gọi hàm blocking (đọc file, Thread.sleep, network đồng bộ) trong suspend function mà không có withContext(Dispatchers.IO) vẫn chặn main thread. Quy ước tốt: suspend function phải main-safe — tự chuyển dispatcher bên trong khi cần.