Android/JETPACK

[JETPACK개론] Coroutine / ViewModelScope

쏭식 2022. 8. 26. 23:59

Coroutine

코루틴은 비동기적으로 실행되는 코드를 간소화 하기 위해 안드로이드에서 사용할 수 있는 동시 실행 설계 패턴이다.

이 전에 포스팅했던 게시물에서 CallBack Hell을 해결할 수 있는 좋은 수단이다

CallBack Hell 관련 게시물 ->

 

[JETPACK개론] Retrofit의 CallBack Hell

전에 Retrofit을 주제로 포스팅했던 글에서 이어서 작성을 해보겠다. 간단하게 아래와 같은 api를 여러 개 불러온다고 가정해보자. @GET("posts/{number}") fun getPostNumber( @Path("number") number : Int ) :..

ssongcode.tistory.com

코루틴의 기초를 한번 다뤄보자.

suspend fun a() {

    //a작업은 오래 걸려서 2초정도
    delay(1000)
    Log.d("TEST", "AP1")

    delay(1000)
    Log.d("TEST", "AP2")
}

suspend fun b() {
    //b작업은 오래 걸려서 2초정도
    delay(1000)
    Log.d("TEST", "BP1")

    delay(1000)
    Log.d("TEST", "BP2")
}

함수 a, b가 있다고 가정하고,

Log.d("TEST", "START")
CoroutineScope(Dispatchers.IO).launch {
    Log.d("TEST", "CoroutineScope START")
    a()
    b()
    Log.d("TEST", "CoroutineScope END")
}
Log.d("TEST", "END")

보통 함수라고 생각한다면, START -> CoroutineScope START -> AP1 -> AP2 -> BP1 -> BP2 -> 

CoroutineScope END -> END 이렇게 예상할 수 있지만 코루틴을 통해 비동기가 적용되어

launch안의 함수들이 실행될 동안 END가 실행되어 다음과 같이 결과가 나타났음을 알 수 있다!!

D/TEST: START
D/TEST: END
D/TEST: CoroutineScope START
D/TEST: AP1
D/TEST: AP2
D/TEST: BP1
D/TEST: BP2
D/TEST: CoroutineScope END

이렇게 코루틴을 통해 비동기적으로 실행되는 코드를 구현할 수 있다!

이번 JETPACK 강의에서는 코루틴을 깊게 다루진 않지만, 이번 계기로 코루틴을 더 공부하여 프로젝트에 적용해봐야겠다!!

ViewModelScope

위에서 CoroutineScope를 이용해봤는데 이제 ViewModelScope를 이용해서 비동기처리를 해보자!

MainActivity에서 버튼을 클릭했을 때 다른 액티비티로 전환이 되고,  전환 됐을 때 다음 ViewModel에서 함수 두 개가 실행된다고 가정해보자.

viewModel = ViewModelProvider(this).get(SecondViewModel::class.java)
viewModel.a()
viewModel.b()
class SecondViewModel : ViewModel() {

    fun a(){
        CoroutineScope(Dispatchers.IO).launch{
            for(i in 0..10){
                delay(1000)
                Log.d("SecondViewModel A : ", i.toString())
            }
        }
    }

    //불필요한 연산을 없앨 수 있음
    fun b(){
        viewModelScope.launch {
            for(i in 0..10){
                delay(1000)
                Log.d("SecondViewModel B : ", i.toString())
            }
        }
    }
}

이렇게 첫번째 액티비티에서 버튼을 클릭한 후, 두 번째 액티비티가 실행됐을 때

위와 같이 로그가 찍힌다. 하지만 여기서 뒤로가기 버튼을 클릭하여 다시 첫 번째 액티비티로 돌아갔을 때

다음과 같이 로그가 찍히는 것을 확인할 수 있다.

이렇게 ViewModelScope를 이용했을 때는 첫 번째 액티비티로 돌아왔을 때 실행이 끊기는 것을 볼 수 있다.

만일 해당 뷰를 지나갔을 때 연산이 필요없어진다면 ViewModelScope를 사용하여 불필요한 연산을 없앨 수 있다는 장점이 있다!!!

 

 

동기/비동기 처리작업 방식에 대해서는 여러 번 공부하고 반복하며 익숙해져야할 것 같다....!!!

 

GitHub - SsongSik/JetPack_Android_Practice: Android practice using the Jetpack library

Android practice using the Jetpack library. Contribute to SsongSik/JetPack_Android_Practice development by creating an account on GitHub.

github.com