반응형
Kotlin Coroutines 실무 가이드
요약: Android 개발에서 Kotlin Coroutines를 효과적으로 사용하는 방법과 자주 발생하는 실수를 정리했습니다.
1. 기본 개념
Coroutines는 경량 스레드로, 비동기 코드를 동기 코드처럼 작성할 수 있게 해줍니다.
// 기본 사용법
lifecycleScope.launch {
val result = withContext(Dispatchers.IO) {
// 네트워크 요청 등 무거운 작업
api.fetchData()
}
// UI 업데이트 (Main 스레드)
textView.text = result
}
2. Dispatcher 선택 가이드
- Dispatchers.Main: UI 업데이트, 가벼운 작업
- Dispatchers.IO: 네트워크, 파일 I/O, 데이터베이스
- Dispatchers.Default: CPU 집약적 작업 (정렬, 파싱 등)
// 잘못된 예 - Main에서 무거운 작업
lifecycleScope.launch {
val data = api.fetchData() // ANR 발생 가능!
}
// 올바른 예
lifecycleScope.launch {
val data = withContext(Dispatchers.IO) {
api.fetchData()
}
}
3. 예외 처리
Coroutines에서 예외 처리는 중요합니다. 처리되지 않은 예외는 앱 크래시로 이어집니다.
val handler = CoroutineExceptionHandler { _, exception ->
Log.e("Coroutine", "Error: ${exception.message}")
}
lifecycleScope.launch(handler) {
// 예외 발생 가능한 코드
}
// 또는 try-catch 사용
lifecycleScope.launch {
try {
val result = api.fetchData()
} catch (e: Exception) {
showError(e.message)
}
}
4. 취소 처리
화면 이동 시 진행 중인 작업을 취소해야 메모리 누수를 방지할 수 있습니다.
// lifecycleScope 사용 시 자동 취소
lifecycleScope.launch {
// Activity/Fragment 종료 시 자동 취소
}
// 수동 취소가 필요한 경우
val job = CoroutineScope(Dispatchers.IO).launch {
while (isActive) { // 취소 상태 확인
// 작업 수행
}
}
job.cancel() // 명시적 취소
5. Flow 활용
실시간 데이터 스트림에는 Flow를 사용하세요.
// Repository
fun getDataFlow(): Flow<List<Item>> = flow {
while (true) {
emit(api.fetchData())
delay(5000) // 5초마다 갱신
}
}.flowOn(Dispatchers.IO)
// ViewModel
viewModelScope.launch {
repository.getDataFlow()
.catch { e -> _error.value = e.message }
.collect { data -> _items.value = data }
}
자주 하는 실수
- GlobalScope 남용 - 메모리 누수 원인
- Main 스레드에서 블로킹 호출
- 예외 처리 누락으로 인한 크래시
- 취소 상태(isActive) 미확인
참고 자료
작성: 밤비스
반응형
'android' 카테고리의 다른 글
| Android Gradle 빌드 실패 해결법 - 캐시 클리어부터 의존성 충돌까지 (0) | 2026.01.31 |
|---|---|
| Android 모바일기기 ADB 무선 연결 후 mac에 미러링 (0) | 2025.03.18 |
| [Android] Import Sceneform Asset 하는방법 (0) | 2021.07.21 |
