코틀린의 코루틴을 인터넷으로 검색해보면, 예제 소스가 대부분이 모두 MainActivity.kt에 있다.
실제 개발자 분들은 MainActivity.kt에서 코루틴을 안 쓸거다.(그렇게 쓰는 걸 봤다고?? 그 회사에서 당장 도망쳐라..)
근데 이론에만 그치는 포스팅에서는 모두 MainActivity.kt에 적고 있다.(이미 그런 포스팅은 넘치니 제발 쓰지 말자..)
아래 acaroom.net/ 의 링크에서는 Adapter에서 코루틴을 사용하고 있다.
그나마 참고 할 만하다.
개념은(여기 말고도 많이 있음..)
codechacha.com/ko/android-coroutine/
코루틴으로 데이터를 가져오는 실제 코드 예제는
안전한 코루틴 사용 방법
www.youtube.com/watch?v=vZIiVxAk5cg&ab_channel=Taehwankwon
코루틴 디버깅(6:00 부터)
원하는 코루틴에서 코드 실행하고 : WithContext() 설명(8:10 부터)
코루틴 굿 패턴
1. 내부 코루틴만 에러 처리 하기
코루틴은 기본으로, children 코루틴(nested coroutine code)에서 예외가 발생하면, 부모까지 모두 예외를 발생 시키고 모두 종료된다.
이럴 경우 Job() 대신에 SupervisorJob()을 사용합니다.
val job = SupervisorJob() // (1) Job() 대신에 SupervisorJob()을 사용
val scope = CoroutineScope(Dispatchers.Default + job)
// 에러를 발생시킵니다.
fun doWork(): Deferred<String> = scope.async { ... }
fun loadData() = scope.launch {
try {
doWork().await()
} catch (e: Exception) { ... }
}
2. job cancel보다는 cancelChildren() 를 이용하자
class WorkManager {
val job = SupervisorJob()
val scope = CoroutineScope(Dispatchers.Default + job)
fun doWork1(): Job = scope.launch { /* do work */ } // (2)
fun doWork2(): Job = scope.launch { /* do work */ } // (2)
fun cancelAllWork() {
scope.coroutineContext.cancelChildren() // (1)
}
}
fun main() {
val workManager = WorkManager()
workManager.doWork1()
workManager.doWork2()
workManager.cancelAllWork()
workManager.doWork1()
}
추가. GlobalScope는 singleton patten으로 되어 있어서, lifecycle이 앱과 동일 하다.(앱이 실행 할 때 발생하고, 앱이 종료 될 때 끝난다.)
그러므로 자주 사용하지 않는게 좋다.
GlobalScope is a singleton that defines its own dispatcher, which is Dispatchers. Default . It is backed by a thread pool. coroutineScope does not define its own dispatcher so you inherit it from the caller, in this case the one created by runBlocking