쏭식
Ssongcode;
쏭식
전체 방문자
오늘
어제
  • 분류 전체보기 (106)
    • JAVA (21)
      • Basic (21)
    • Kotlin (14)
      • Basic (14)
    • Android (64)
      • Basic (24)
      • JETPACK (30)
      • Compose (8)
      • 파고들기 (2)
    • Project (4)
    • etc (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 백준
  • 알고리즘
  • Kotlin
  • 변수
  • 배열
  • ViewModel
  • 기초100제
  • AAC
  • 코틀린코테
  • Android
  • 리사이클러뷰
  • mvvm
  • DataBinding
  • 컴포즈
  • 자바
  • livedata
  • Room
  • 프로젝트회고
  • 코틀린
  • 코테
  • 객체지향
  • compose
  • Adapter
  • 코드업100제
  • 상속
  • Jetpack
  • workmanager
  • 코딩테스트
  • 자료구조
  • 메소드

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쏭식

Ssongcode;

[JETPACK개론] Coroutine / ViewModelScope
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

 

저작자표시 (새창열림)

'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
    'Android/JETPACK' 카테고리의 다른 글
    • [JETPACK개론] Retrofit + ViewModelScope + RV + Glide
    • [JETPACK개론] Retrofit 예제 + RecyclerView
    • [JETPACK개론] Retrofit의 CallBack Hell
    • [JETPACK개론] Retrofit
    쏭식
    쏭식

    티스토리툴바