BuNa_
IT Story
BuNa_
전체 방문자
오늘
어제
  • 분류 전체보기 (117)
    • CS (14)
      • 운영체제 (8)
      • 네트워크 (0)
      • Design Pattern (1)
      • OOP (4)
    • 대외활동 (24)
      • 우아한테크코스 (14)
      • DND 동아리 (4)
      • UMC 동아리 (5)
      • 해커톤 (1)
    • Android (29)
      • MVVM (2)
      • 스터디 (11)
      • Compose (3)
      • Unit Test (1)
    • Project (5)
      • 어따세워 (5)
      • DnD 과외 서비스 (0)
    • Programming (11)
      • Kotlin (4)
      • 파이썬 (7)
    • Git (1)
    • 인공지능 (22)
    • 백준 (8)
    • 기타 (3)
      • IntelliJ (1)
      • 일상 (0)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • ViewModel
  • k-means++
  • 인공지능 분류
  • 파이썬
  • 우테코 5기
  • 딥러닝
  • 우아한테크코스
  • 우테코
  • Android
  • UMC
  • 외부 단편화
  • 백준
  • 원시값 포장
  • 컴공선배
  • 안드로이드
  • 셀레니움
  • External fragmentation
  • MVVM
  • 우테코 프리코스
  • 어따세워
  • Compose
  • Ai
  • 인공지능
  • K-means
  • Baekjoon
  • 선형회귀
  • 객체지향 생활체조
  • 운영체제
  • RecyclerView
  • 다이나믹 프로그래밍

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
BuNa_

IT Story

[Android] 코루틴 suspendCancellableCoroutine 비동기 처리
Android/스터디

[Android] 코루틴 suspendCancellableCoroutine 비동기 처리

2021. 12. 2. 20:08

 

프로젝트를 진행하던 중, 문제가 맞닥들였다.

문제는 회원가입 / 로그인 기능을 구현에 있었는데 함께 살펴보도록 하자.

 

'문제가 되는 회원가입(register) 함수'

 

위 코드는 Retrofit2 라이브러리를 이용해 회원정보를 서버로 넘기는 메소드이다.

User DTO를 성공적으로 넘겼다면 onResponse 함수가 실행될 것이다.

이 부분만 보면 큰 문제를 느끼지 못 할 것이다.

 

하지만, 만약 register()를 완료한 후에 실행되어야 할 함수가 먼저 실행되면 어떤 문제가 발생하게 될까?

register() 메서드 안의 코드는 콜백 형식이기 때문에 위 코드처럼 사용하게 된다면 정상적인 로직을 수행할 수 없다.

(본인의 경우 register()를 호출 한 후에 로그인을 완료를 알리는 메서드를 통해 다음 액티비티로 넘어가는 로직을 수행하고자 하였다.)

 

 

'코루틴(Kotlin Coroutine)'

 

이 때 사용해야하는 것이 바로 코루틴(Coroutine)이다.

나는 그 중에서도 suspendCancellableCoroutine을 사용하였다.

suspendCancellableCoroutine은 코루틴을 잠시 일시정지시킬 수 있는 함수이다.

따라서 register메서드를 suspend로 형식으로 바꾸고, 안의 로직들을 suspendCancellableCoroutine으로 감싸주면 문제가 해결될 것이다.

 

'기존의 register 함수에서 suspendCancellableCoroutine을 추가한 형태'

 

코드를 살펴보면 continuation.resume()이라는 함수가 보일 것이다.

저 함수는 일시중지한 코루틴을 다시 깨우는 메소드로, 응답을 완료하였다면 그 다음 코루틴들을 실행하라는 의미이다.

 

viewModelScope.launch {
  // repository를 통해 회원가입 요구(중복 계정일 경우 백엔드에서 처리)
  userRepository.register(
    User(
      user?.id.toString(),
      user?.kakaoAccount?.email,
      user?.kakaoAccount?.profile?.nickname!!,
      LoginType.KAKAO_TALK.name
    )
  )

  Timber.d("Register completed, Trying Signining Kakao Talk ...")
  loginCallback?.onSignIn(
  	LoginType.KAKAO_TALK,
  	ResultType.SUCCESS
  ) // 다음 액티비티 실행을 위한 콜백 수행
}

 

register()를 호출하는 부분을 스코프(Scope)로 감싸면 끝이다.

이렇게 코드를 작성하면, register()를 수행한 후에, 이어서 onSignIn() 메서드가 순차적으로 수행된다.

 


 

왼쪽은 이전 코드의 로그 결과로, register()가 모두 수행되기도 전에 ViewModel에서 그 다음 작업이 실행된 상황이다.

하지만, 코드를 수정한 오른쪽 결과를 보면, 정상적으로 register()을 수행하고 그 이후 ViewModel의 작업이 수행됨을 볼 수 있다.

 

이처럼 코루틴(Coroutine)을 적절히 활용하면 코드의 흐름을 컨트롤할 수 있음을 배울 수 있다.

아직 부족한게 많기 때문에 계속해서 공부해나가야 겠다.

저작자표시 비영리 변경금지 (새창열림)

'Android > 스터디' 카테고리의 다른 글

[Android] RecyclerView LayoutPosition vs AdapterPosition 차이를 알아보자!  (0) 2021.12.22
[Android] MVVM ViewModel 오류 : Can't access ViewModels from detached fragment 해결방법!  (4) 2021.12.19
[Android] 카카오맵을 2개 이상 ADD했을 때 발생하는 오류 대처 방법! DaumMap does not support that two or more  (2) 2021.12.17
[Android] OutOfMemoryError: Java heap space 오류 해결 방법  (0) 2021.12.07
[Android] startActivityForResult() depreacted 해결 : ActivityResultContracts  (0) 2021.12.01
    'Android/스터디' 카테고리의 다른 글
    • [Android] MVVM ViewModel 오류 : Can't access ViewModels from detached fragment 해결방법!
    • [Android] 카카오맵을 2개 이상 ADD했을 때 발생하는 오류 대처 방법! DaumMap does not support that two or more
    • [Android] OutOfMemoryError: Java heap space 오류 해결 방법
    • [Android] startActivityForResult() depreacted 해결 : ActivityResultContracts
    BuNa_
    BuNa_
    안드로이드 개발자를 향해 달리고 있는 공대생입니다! 🧑 Android, Kotlin, Java, Python 등 학습하고 있는 내용과 프로젝트를 주로 업로드하고 있습니다. 지적과 조언은 언제나 환영입니다!😊 github : https://github.com/tmdgh1592

    티스토리툴바