Coroutine
코루틴은 비동기적으로 실행되는 코드를 간소화 하기 위해 안드로이드에서 사용할 수 있는 동시 실행 설계 패턴이다.
이 전에 포스팅했던 게시물에서 CallBack Hell을 해결할 수 있는 좋은 수단이다
CallBack Hell 관련 게시물 ->
코루틴의 기초를 한번 다뤄보자.
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를 사용하여 불필요한 연산을 없앨 수 있다는 장점이 있다!!!
동기/비동기 처리작업 방식에 대해서는 여러 번 공부하고 반복하며 익숙해져야할 것 같다....!!!
'Android > JETPACK' 카테고리의 다른 글
[JETPACK개론] Retrofit + ViewModelScope + RV + Glide (0) | 2022.08.28 |
---|---|
[JETPACK개론] Retrofit 예제 + RecyclerView (0) | 2022.08.27 |
[JETPACK개론] Retrofit의 CallBack Hell (0) | 2022.08.25 |
[JETPACK개론] Retrofit (0) | 2022.08.24 |
[JETPACK개론] DataBinding + ViewModel + LiveData (0) | 2022.08.21 |