본문 바로가기

코루틴

(7)
[Coroutines 마스터] Coroutine Cancellation 상세 처리 안녕하세요! 허접 샴푸입니다. 오늘은 Coroutine Cancellation 처리에 대해서 자세하게 다루어 볼까 합니다. [문제점] 전 포스트에서, job.cancel()을 통해 실행 중인 Coroutine을 취소하였는 데 취소된 상태로 화면이 남아있었습니다. 취소가 되었다면 다시 실행이 가능토록 해야 하는 데 말이죠. 그렇다고 job.cancel() 이후에 onStop() 오버라이드 함수 내에서 Button을 다시 Enabled 하고, TextView를 다시 세팅한다는 것이 가독성도 떨어지고 유지보수에도 매우 힘들 것으로 판단됩니다. 그럼 어떻게 처리해야 할까요? 방법은 다양하겠지만 제가 생각하는 좋은 방법을 말씀드리도록 하겠습니다. [개요] Coroutine의 경우 실행 중인 Coroutine이 취..
[Coroutines 마스터] Coroutine Cancellation 기초 안녕하세요! 허접샴푸입니다. 오늘은 Coroutine Cancellation에 대해서 매우 짧고 간단한 글을 작성해볼까 합니다. [질문] 돌고 있는 Coroutine을 어떻게 취소시킬 수 있을까요? - 예제를 같이 봐봅시다. [코드] 이전 포스트와 같은 코드이며, 단순히 runTime() 함수 내에서 실행이 끝나면 Toast를 띄우도록 하였습니다. [실행화면] [문제점] 위 실행화면을 보면, 홈 버튼을 클릭하여 바탕화면으로 이동을 하였음에도 불구하고, 앱 내의 Toast가 띄워집니다. 이러면 Ux적으로 문제겠죠? 홈 화면으로 화면 전환을 하였으면 해당 작업은 취소가 되어서 Toast가 띄워지면 안 되는데 말이죠. [방향] 이를 해결하기 위해 Coroutine을 Cancel 해보도록 합시다. 물론, Cor..
[Coroutines 마스터] 흔히 하기 쉬운 실수(CountDown Timer) 안녕하세요! Coroutine을 사용할 때 있어서 흔히 하기 쉬운 실수에 대해서 예제와 함께 설명드리도록 하겠습니다. [예제 화면] 단순하게 TextView 2개, Button 1개로 화면을 구성해보았습니다. 아래 코드를 보면 알겠지만, Button을 클릭하면 5초 동안 타이머를 TextView에 (남은 초) 보여주며 타이머가 끝나면 "Ended" 문구를 다른 TextView에 출력합니다. [코드] Dispatchers.Main.immediate을 사용하였으며 runTime()이라는 suspend 함수를 만들어, seconds가 0이 될 때까지 1씩 차감하여 화면에 남은 초를 출력합니다. [실행화면] 무언가 이상하지 않나요? 전 포스트에서 Dispatchers.Main.immediate을 사용하면 순서가..
[Coroutines 마스터] Dispatchers.Main vs Dispatchers.Main.immediate 안녕하세요~! 오랜만에 다시 돌아왔습니다. 부연 설명 없이 단순 명료하게 글을 작성하도록 하겠습니다. Coroutine을 사용할 때 Dispatchers.Main과 Dispatchers.Main.immediate의 차이는 무엇일까요? 매우 간단합니다. 아래 예제를 봅시다. 1) Dispatchers.Main 을 사용할 시 [결과] testDispatchersMain() 함수를 호출하면, 결과는 아래와 같이 나옵니다. 일반적으로 코드는 Top-Down 방식으로 진행이 되죠. 그래서 위 코드를 보면, 예상된 결과는 Zero -> First -> Second 일 것입니다. 하지만 Zero -> Second -> First가 출력되었습니다. 2) Dispatchers.Main.immediate을 사용할 시 [결..
[배달의 민족] UI 따라만들기 3편 (Viewpager2, Coroutine, LifecycleScope) 안녕하세요 허접샴푸입니다~! 배달의 민족 따라만들기 3편입니다! 3편에서는 자동으로 스크롤 되는 ViewPager2에 대해 알아 보도록 하겠습니다. 구글에서 밀고 있는 Coroutine을 사용하도록 하겠습니다. [자료] 지난 2편에서는 좌우로 Swipe 되는 이미지 배너를 구현하였죠? 이번 편에서는 좌우로 손을 대지 않아도 알아서 Swipe 되도록 하겠습니다. 잘 아시겠지만 자동이라고 하면 결국 thread 를 사용해야 하는데 구글에서 권장하고 있는 놈이 바로 Coroutine입니다. 즉 유저는 앱을 사용하고 있으면서, 이미지 배너는 자동으로 Swipe 되는 비동기 처리가 되어야 합니다. 이에 적합한 것이 바로 Coroutine 입니다. 그리고 LifecycleScope를 사용하여 편하게 만들어 보도록 ..
안드로이드 Kotlin, Coroutine으로 Custom Loading Dialog(커스텀 로딩 다이얼로그) 구현하기 안녕하세요 허접샴푸입니다~! 이번에는 Coroutine을 이용하여 커스텀 Dialog를 2초 동안 보여지게 하고 2초 후 꺼지게 하는 방법에 대해 설명해 드리도록 하겠습니다. Coroutine 공식 github 사이트를 통해 더 많은 정보를 얻어가시기 바랍니다. Coroutine -> https://github.com/Kotlin/kotlinx.coroutines Kotlin/kotlinx.coroutines Library support for Kotlin coroutines . Contribute to Kotlin/kotlinx.coroutines development by creating an account on GitHub. github.com [1] 먼저 Coroutine을 사용하기 위해서는 bu..
안드로이드 Kotlin으로 Custom Loading Dialog(커스텀 로딩 다이얼로그) 구현하기 안녕하세요! 허접샴푸입니다. 정말 오랜만에 돌아왔습니다 ㅜㅜ 앞으로 Kotlin으로 많은 Tip을 제공해드리도록 하겠습니다. 먼저 Kotlin으로 Custom Dialog 을 구현하는 방법을 알려드리겠습니다. 많은 프로젝트에서 사용하시기 바랍니다~! [1] LoadingDialog.kt 을 생성한다 별 특별한 내용이 없습니다. LoadingDialog class는 Dialog를 상속받기 때문에 Context 를 필요로 합니다. 그래서 constructor에 Context를 인자로 받으며, 받은 인자를 Dialog(contenxt) 와 같이 넘겨줍니다. init {} 을 통해 초기화를 시켜주는 데, setCanceledOnTouchOutside(false) 를 작성하여, 다이얼로그 외부 화면을 터치할 때 ..