Notice
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- rxjava hot observable
- 객체
- rxjava disposable
- 안드로이드 유닛 테스트
- Rxjava Observable
- 안드로이드 유닛테스트란
- 안드로이드 os 구조
- 멤버변수
- 스택 큐 차이
- 안드로이드 유닛 테스트 예시
- android ar 개발
- ar vr 차이
- 안드로이드 레트로핏 crud
- 2022 플러터 설치
- 큐 자바 코드
- 플러터 설치 2022
- jvm이란
- ANR이란
- 클래스
- 안드로이드 라이선스 종류
- 서비스 vs 쓰레드
- android retrofit login
- 안드로이드 레트로핏 사용법
- 스택 자바 코드
- 자바 다형성
- 안드로이드 라이선스
- 2022 플러터 안드로이드 스튜디오
- 서비스 쓰레드 차이
- jvm 작동 원리
- rxjava cold observable
Archives
- Today
- Total
나만을 위한 블로그
[Android] Coroutine의 Job과 Dispatchers란? 본문
728x90
반응형
코루틴을 시작할 때 코루틴의 취소 등 제어를 위해 CoroutineContext를 지정한다. CoroutineContext란 Job, CoroutineDispatcher 등이 모여있는 집합으로 코루틴이 실행되는 환경이다.
코루틴으로 비동기 작업을 실행할 때 기본적인 사용법은 아래와 같다.
val coroutine = CoroutineScope(Dispatchers.IO).launch {
// ...
}
위 코드에서 CoroutineScope() 안에 넣어준 매개변수가 CoroutineContext다. Dispatchers를 넣었지만 Job도 넣어서 사용할 수 있다.
val job = Job()
val coroutine = CoroutineScope(job + Dispatchers.IO).launch {
// ...
}
val coroutine2 = CoroutineScope(Dispatchers.IO).launch {
// ...
}
job.cancel()
Job과 Dispatchers은 각각 아래와 같다.
https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/
배경 작업. 개념적으로 작업은 완료로 끝나는 생명주기가 있는 취소 가능한 것이다. 작업을 부모-자식 계층 구조로 정렬할 수 있다. 부모를 취소하면 모든 자식이 재귀적으로 즉시 취소된다. 이 동작은 SupervisorJob을 써서 커스텀할 수 있다
Job 인터페이스의 가장 기본적인 인스턴스는 다음과 같이 생성된다
- Coroutine Job : launch 코루틴 빌더 실행으로 생성된다. 지정된 코드 블록을 실행하고 이 블록이 완료되면 완료 처리된다
- CompletableJob : Job() 팩토리 함수로 생성된다. CompletableJob.complete를 호출하면 완료된다
개념적으로 Job 실행은 결과값을 생성하지 않는다. Job은 부작용을 위해서만 시작된다. Job은 아래와 같은 상태를 갖는다
모든 코루틴 디스패처 구현으로 확장되는 기본 클래스
- Dispatchers.Default : Dispatcher나 다른 ContinuationInterceptor가 컨텍스트에 지정되지 않은 경우 launch, async 같은 모든 표준 빌더에서 사용되는 기본 CoroutineDispatcher다. JVM의 공유 쓰레드 풀에서 지원된다
- Dispatchers.IO : 요청 시 생성된 쓰레드의 공유 풀을 사용하고 파일 입출력, 소켓 입출력 같은 입출력 집중 차단 작업의 오프로드를 위해 설계됐다
- Dispatchers.Unconfined : 특정 쓰레드에 국한되지 않는 코루틴 디스패처. 현재 호출 프레임에서 코루틴의 초기 연속을 실행하고 특정 쓰레딩 정책을 요구하지 않으며 해당 일시중단 함수에서 사용하는 모든 쓰레드에서 코루틴을 재개할 수 있다. 코루틴 빌더 함수가 반환되는 첫 번째 중단까지 현재 호출 프레임에서 코루틴 실행을 시작한다. 일반적으로 사용하면 안 된다
안드로이드 디벨로퍼의 경우 Unconfined 디스패처를 아예 적어두지 않았다. Dispatchers 뒤에 온점을 찍으면 자동완성 리스트에 표시되기는 한다.
https://developer.android.com/kotlin/coroutines/coroutines-adv?hl=ko#main-safety
- Dispatchers.Main : 메인 쓰레드에서 코루틴을 실행한다. 이 Dispatcher는 UI와 상호작용하고 빠른 작업을 실행하기 위해서만 써야 한다. suspend 함수를 호출하거나 UI 작업 실행, LiveData 업데이트 시 사용한다
- Dispatchers.IO : 메인 쓰레드 밖에서 디스크 or 네트워크 입출력을 실행하도록 최적화되어 있다. Room DB를 사용하고 파일 입출력, 네트워크 작업을 실행한다
- Dispatchers.Default : CPU를 많이 사용하는 작업을 메인 쓰레드 밖에서 실행하도록 최적화되어 있다. 리스트 정렬, JSON 파싱 등을 수행한다
둘의 차이를 정리하면 아래와 같다.
- Job : 코루틴을 식별, 정렬하고 제어하는 용도로 사용
- Dispatchers : 코루틴을 어떤 쓰레드에서 실행시킬 건지 정하는 용도로 사용
만약 코루틴을 만들었는데 Dispatchers를 지정하지 않았다면 위에 적었듯 Dispatchers.Default가 적용된다.
이것과 관련한 스택오버플로우 답변이 있는데 참고하면 좋을 것 같아 링크를 걸어둔다.
반응형
'Android' 카테고리의 다른 글
[Android] Android 13 변경사항 (0) | 2023.02.27 |
---|---|
[Android] 안드로이드 스튜디오 Electric Eel 업데이트 후 앱 실행 시마다 Run 탭 올라오지 않게 하기 (0) | 2023.02.04 |
[Android] LiveData observe()가 여러 번 호출되는 에러 해결 (0) | 2023.01.31 |
[Android] 리사이클러뷰 페이징 처리 (페이징 라이브러리 X) (0) | 2023.01.30 |
[Android] 지연 초기화, lateinit vs Lazy (0) | 2023.01.28 |
Comments