Hello, Android!
코루틴의 동작 제어 본문
- 반복
반복하는 코드를 작성하기 위해서 repeat() 함수를 사용할수 있다
repeat()을 사용하게 되면 데몬 스레드로 실행하게 된다
- 데몬 스레드
데몬 스레드는 주 스레드와는 별개로 만들어지는 보조 스레드이다
주 스레드가 종료되면 데몬 스레드는 강제적으로 종료된다
repeat의 매개변수로 반복 횟수가 들어간다
하지만 repeat이 launch 내에서 반복을 하지만
launch는 GlobalScope로 생명 주기가 한정되어 있기 때문에
메인 스레드가 종료되면 같이 종료된다
- 작업 취소
cancel 함수를 사용하게 되면 원하는 타이밍에 코루틴 작업을 취소하는것이 가능하다
launch를 통하여 코루틴 작업을 실행하지만
main 함수의 끝에서 job.cancel() 이 있기때문에
코루틴 작업 실행 후 3초 뒤 cancel을 만나
작업을 취소하게 된다
- finally 실행
try ~ finally를 사용하면 코루틴 종료시에 finally 블록을 실행하게 된다
코루틴 실행 후 약 1.3초가 지난 뒤 코루틴을 취소하게 된다
하지만 코루틴 내부에 try ~ finally 구문이 있어서
finally 블록이 실행된 뒤 main함수의 마지막 println 함수가 호출된다
만약 finally 블록에서 시간이 많이 걸리는 작업 혹은 지연 함수가 사용되는 경우
실행을 보장하기 위해 NonCancellable 문맥에서 실행해야 한다
finally 블록에서 NonCancellable 문맥에서
withContext in finally 를 출력한 뒤
1초 기다리고
NonCancellable delay 1000 이 출력된 뒤
main end 가 출력된다
만약 NonCancellable 문맥 없이 위와 같이 실행하게 되면
NonCancellable delay 1000 는 출력하지 못한다
- 실행 상태의 판단
만약 취소 시그널을 받아 특정 작업을 하기 위해서는 isActivity 를 활용하면 된다
isActive는 실행중일때는 true가
취소된 상태에서는 false가 넘어온다
- 코루틴 시간의 만료
withTimeout() 함수를 사용하면 매개변수에 지정한 시간이 지난 뒤
함수의 블록을 취소한 뒤 TimeoutCancellationException 에러를 발생시킨다
'Kotlin' 카테고리의 다른 글
채널 (0) | 2020.09.21 |
---|---|
코루틴의 문맥 (0) | 2020.09.12 |
runBlocking (0) | 2020.09.06 |
코루틴 launch, async (0) | 2020.09.05 |
스레드 (0) | 2020.08.29 |