728x90
- 중단 함수는 코틀린 코루틴의 핵심이다.
- 코루틴은 중단되었을 때 Continuation 객체를 반환한다.
- 중단했을 때 어떤 자원도 사용하지 않는다
- 실행이 중지 되어있을 때 스레드를 차지하지 않아 다른 작업에 스레드를 할당할 수 있다는 뜻.
- delay - 중단
- 코루틴의 실행을 지정된 시간 동안 일시적으로 중단하는 데 사용된다.
- delay(timeInMillis) 함수는 매개변수(ms) 단위로 현재 코루틴을 중단하며 시간이 지나면 자동으로 다시 시작된다.
- 비블로킹 특성을 가진다.
- 스레드를 차단하지 않는다.
- 코루틴은 일시 중단되지만, 그 로쿠틴이 실행되고 있던 스레드는 다른 작업을 계속 수행할 수 있다.
- 지정된 시간이 지난 후에는 중단되었던 지점에서 실행을 재개하는데, 이과정은 코루틴의 컨티뉴에이션 매커니즘을 통해 이루어 진다.
- 코루틴 블록 또는 suspend 함수 내부에서만 호출할 수 있다.
- resume - 재개
- resume 함수에 Unit 을 인자로 넣는다.suspendConroutine 의 타입 인자로 Unit 을 사용한다
- Unit
- 자바의 void 와 유사한 역할을 하지만 Unit 은 객체로서의 특성을 가진 실제 타입
- Unit 은 객체이므로, 변수에 할당하거나 다른 함수의 매개변수로 전달할 수 있다.
- Unit 을 반환하는 타입은 명시적으로 Unit 이라 지정하지 않아도 Unit을 반환한다.
- Unit
- 실패에 대한 처리
- 만약 외부 api 호출시 실패에 의한 에러 처리를 원한다면?
- resumeWithException 사용
- 비동기 작업이 실패했을 때 예외를 코루틴으로 전파합니다. 이 방법은 코루틴의 중단 지점에서 실패를 처리하고자 할 때 유용합니다.
- try catch 형식으로 처리할 수 있다.
- suspend fun fetchApiData(): ApiResponse {
return try {
// API 호출
apiService.getData()
} catch (e: Exception) {
// 예외 처리
handleError(e)
}
}
- suspend fun fetchApiData(): ApiResponse {
- 타임아웃 처리
- suspend fun fetchApiDataWithTimeout(): ApiResponse? {
return withTimeoutOrNull(5000L) { // 5초 타임아웃
apiService.getData()
}
}
- suspend fun fetchApiDataWithTimeout(): ApiResponse? {
- 재시도 로직
- suspend fun fetchApiDataWithRetry(retries: Int = 3): ApiResponse? {
repeat(retries) {
try {
return apiService.getData()
} catch (e: Exception) {
if (it == retries - 1) throw e
}
}
return null
}
- suspend fun fetchApiDataWithRetry(retries: Int = 3): ApiResponse? {
- 코루틴 핸들러 사용- CoroutineExceptionHandler ㄹㄹ 사용하여 코루틴 스코프 내에서 발생하는 모든 예외를 처리할 수 있다. 이 방법은 코루틴 스코프 전체에 대한 에러 처리가 필요할 때 유용하다.
- val handler = CoroutineExceptionHandler { _, exception ->
handleError(exception)
}
val scope = CoroutineScope(Job() + Dispatchers.Main + handler)
scope.launch {
// API 호출
}
- val handler = CoroutineExceptionHandler { _, exception ->
- 응답 검증 - api 의 응답을 검증하여 처리한다.
- suspend fun fetchApiData(): ApiResponse {
val response = apiService.getData()
if (response.isSuccessful) {
return response.body() ?: throw ApiException("No data")
} else {
throw ApiException("API Error: ${response.code()}")
}
}
- suspend fun fetchApiData(): ApiResponse {
- resumeWithException 사용
- 만약 외부 api 호출시 실패에 의한 에러 처리를 원한다면?
- resume 함수에 Unit 을 인자로 넣는다.suspendConroutine 의 타입 인자로 Unit 을 사용한다
728x90
'공부 > 코틀린코루틴:딥다이브(마르친 모스카와)' 카테고리의 다른 글
7장 - 코루틴 컨텍스트 (0) | 2024.01.29 |
---|---|
6장 - 코루틴 빌더 (0) | 2024.01.29 |
4장 - 코루틴의 실제 구현 (2) | 2024.01.14 |
2장 - 시퀀스 빌더 (0) | 2024.01.13 |
1장 - 코틀린 코루틴을 배워야 하는 이유 (0) | 2024.01.13 |
댓글