일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 키보드 숨기기
- Android
- 코틀린
- 클린아키텍처
- list adapter
- koltin
- 뷰모델팩토리
- 화면전환
- 계층 분리
- notifyDataSetChanged 비효율
- ColdStream
- 의존성주입
- DiffUtilCallback
- 안드로이드 DB
- hilt
- error
- SQLite
- DI
- notifyDataSetChanged 대신 사용하기
- fragment
- 안드로이드 스튜디오 구버전 다운받기
- Clean Architecture
- HotStream
- compose
- 다른버전 다운로드
- Kotlin
- android aac
- 안드로이드
- 앱개발
- 어댑터 효율적으로 사용하기
Archives
- Today
- Total
DoReMi
[Kotlin] Coroutine 본문
코루틴을 왜 쓰게 되었는가..?
웹, 앱 분야에서 비동기 처리의 핵심으로 RX programming을 사용했다. 하지만 구글이 안드로이드 공식 언어를 코틀린으로 변경한 이후로 비동기처리를 coroutine으로 바꾸었다.
코루틴을 사용하면 비동기처리를 쉽게 할 수 있기 때문에
Coroutine Scope
Coroutine Scope 선언 방식
CoroutineScope(Dispatchers.IO).launch {
//code
}
이런식으로 View에서 lifecycleScope를 사용하면 View의 라이프사이클과 연계하여 사용할 수 있다.
//activity
lifecycleScope.launch(Dispatchers.IO) {
//code
}
라이프사이클이 파괴되면 스코프는 취소 된다.
Dispatcher 활용
- GlobalScope에 launch는 파라미터로 Dispatcher을 받을수있습니다.
- Dispatcher는 CoroutineContext를 상속받아 어떤스레드를 이용해서 동작할 것인지 미리 정해주는 역할을 합니다.
ViewModel CoroutineScope
- ViewModel 에 연결된 CoroutineScope - ViewModel에서만 사용가능
- 즉, ViewModel이 사라지면 스코프도 취소 됨. (ViewModel 라이프사이클과 연관)
- Main쓰레드 말고 다른 쓰레드에서 실행하고 싶다면???
- withContext(Dispatchers.Default)
async와 await
- async
- 결과나 예외를 반환한다.
- 실행결과는 Deferred<T>를 통해서 반환하며 await을 통해서 받을 수 있다.
- 예시→ 네트워크 작업을 하는 스레드로 비동기 작업을 할건데 결과나 예외를 반환해주세요~ 라는 뜻
- CoroutineScope(Dispatchers.IO).async { // 여기서 무언가 작업을... }
- await
- await는 작업이 완료될때까지 기다리도록 한다.
- 예시→ await함수를 사용한 코드는 작업이 완료될 때까지 기다렸다가 textView~~가 작동한다.
- CoroutineScope(Dispatchers.Main).launch { val html = CoroutineScope(Dispatchers.IO).async { getHtml() }.await() textView.text = html.toString() }
Coroutine Flow
밑에 조금 유용해보이는 블로그를 넣어둘게요! 이런 심오한 내용은 각자 공부하시죠!
Kotlin Coroutine Flow 총정리 part3 # launchIn
- 살짝 블로그 내용을 조금 알려드리자면…
- Flow
- Coroutine의 비동기 스트림 API
- Hot Stream vs Cold Stream
- Flow Cancellation(취소)
- whitTimeoutOrNull
- flow cancellation 체크
- 빌더
- flowOf
- asFlow
- Operator(중간 연산자)
- map
- onEach
- filter, filterNot
- transform
- take, takeWhile
- drop, dropWhile
- Terminal Operators
- toList, toSet
- first, single
- reduce
- fold
- count
- launchIn, onEach
- Flow
코루틴은 언제 사용해야 할까??
- 네트워크 호출 : 안드로이드 앱에서 서버와 통신할 때, 코루틴은 네트워크 호출을 비동기적으로 처리하고 응답을 기다리는 동안 UI를 차단하지 않도록 도와줍니다.
- 데이터베이스 액세스 : 로컬 데이터베이스와 상호 작용할 때, 코루틴은 데이터베이스 액세스를 비동기적으로 처리하고 메인 스레드를 차단하지 않도록 도와줍니다.
- 긴 작업 : 앱에서 오랜 시간이 걸리는 작업을 수행해야 할 때, 예를 들어 이미지 다운로드, 파일 처리, 데이터 가공 등, 코루틴을 사용하여 메인 스레드를 차단하지 않고 작업을 수행할 수 있습니다.
- 병렬 작업 : 여러 개의 작업을 병렬로 실행하고 결과를 조합해야 할 때, 코루틴은 병렬성을 효과적으로 다루는데 도움이 됩니다.
- UI 업데이트 : 백그라운드 스레드에서 수행된 작업의 결과를 UI에 업데이트해야 할 때, 코루틴을 사용하여 안전하게 UI 업데이트를 수행할 수 있습니다.
- 연속된 비동기 작업 : 여러 비동기 작업을 순차적으로 실행하고 그 결과에 따라 다음 작업을 수행해야 할 때, 코루틴은 코드를 더 간결하고 가독성 좋게 작성할 수 있도록 도와줍니다.
코루틴을 사용할 때 주의 할 점
- 메모리 누수
- 예외 처리
Job 과 async의 차이
- launch가 반환하는건 Job
- async가 반환하는건 Deffered
- Deffered는 Job을 상속한 클래스이기 때문에 launch대신 async를 사용해도 문제가 없다.