컴퓨터공부/Kotlin & Java

코틀린 + 코루틴(Coroutines)

achivenKakao 2020. 9. 22. 09:41

코틀린의 코루틴을 인터넷으로 검색해보면, 예제 소스가 대부분이 모두 MainActivity.kt에 있다. 

실제 개발자 분들은 MainActivity.kt에서 코루틴을 안 쓸거다.(그렇게 쓰는 걸 봤다고?? 그 회사에서 당장 도망쳐라..)

근데 이론에만 그치는 포스팅에서는 모두 MainActivity.kt에 적고 있다.(이미 그런 포스팅은 넘치니 제발 쓰지 말자..)

아래 acaroom.net/ 의 링크에서는 Adapter에서 코루틴을 사용하고 있다.

그나마 참고 할 만하다.

 

개념은(여기 말고도 많이 있음..)

    codechacha.com/ko/android-coroutine/

 

코루틴으로 데이터를 가져오는 실제 코드 예제는

    acaroom.net/ko/blog/youngdeok/%EC%97%B0%EC%9E%AC-%EC%BD%94%ED%8B%80%EB%A6%B0-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-02-7%EB%8B%A8%EA%B3%84-%EC%BD%94%EB%A3%A8%ED%8B%B4%EC%9D%98-%EC%82%AC%EC%9A%A9

 

안전한 코루틴 사용 방법

    www.youtube.com/watch?v=vZIiVxAk5cg&ab_channel=Taehwankwon

 

코루틴 디버깅(6:00 부터)

    www.youtube.com/watch?v=0uIrl47bSTA&list=PLbJr8hAHHCP5N6Lsot8SAnC28SoxwAU5A&index=6&ab_channel=%EC%83%88%EC%B0%A8%EC%9B%90

 

원하는 코루틴에서 코드 실행하고 : WithContext() 설명(8:10 부터)

www.youtube.com/watch?v=0uIrl47bSTA&list=PLbJr8hAHHCP5N6Lsot8SAnC28SoxwAU5A&index=6&ab_channel=%EC%83%88%EC%B0%A8%EC%9B%90

 

코루틴 굿 패턴

    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()
}

 

 

출처 : medium.com/harrythegreat/%EB%B2%88%EC%97%AD-%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%BD%94%EB%A3%A8%ED%8B%B4%EC%9D%98-%ED%8C%A8%ED%84%B4%EA%B3%BC-%EC%95%88%ED%8B%B0%ED%8C%A8%ED%84%B4-6e97f852ea2d

 

추가. 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