본문 바로가기

안드로이드

(28)
[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을 사용할 시 [결..
[배달의 민족] 따라만들기 10-2편 (Dagger-Hilt) 안녕하세요! 이번 편에서는 코드를 수정하도록 하겠습니다. Dagger-Hilt에 관해서는 아래 링크인 공식문서를 참고해보시기 바랍니다. dagger.dev/hilt/quick-start Quick Start Guide Introduction Hilt makes it easy to add dependency injection to your Android app. This tutorial will guide you through bootstrapping an existing app to use Hilt. For more on the basic concepts of Hilt’s components, check out Hilt Components. Gradle vs non dagger.dev 그럼 저희 코드에 ..
[배달의 민족] 따라만들기 10-1편 (Dagger-Hilt) 안녕하세요! 무책임하게 다음 글을 올리지 않았습니다. 처음부터 다시 차근차근 같이 만들어 가보도록 하겠습니다. 이번 편은 시간이 지남에 따라, 몇몇 업데이트 및 MVVM의 꽃인 Dependency Injection(의존성 주입) 프레임워크인 Dagger Hilt를 사용하도록 하겠습니다. [버전 업데이트 관련] 저도 오랜만에 Github에서 코드를 다운로드하여 실행해보았으며 문제없이 작동이 되는 것을 확인하였습니다. 먼저 오랜만에 프로젝트를 열었기 때문에 build.gradle 파일 내에 몇몇 버전이 업데이트되었습니다. 굳이 일일이 다 짚고 넘어갈 필요가 없기 때문에 업데이트한 프로젝트 파일을 깃허브에 올려놓았습니다.(아래 링크 참조) 필요시 해당 깃허브에서 프로젝트를 다운로드하시고 현재 글을 보며 따라 ..
Dialog 관련 Activity 생명주기 안녕하세요! 오랜만에 글 남깁니다. 이런 질문을 보았습니다. Dialog를 화면에 띄울 때 Dialog를 띄우는 Activity의 onPause()가 호출되는가? 그리고 권한 요청 다이얼로그를 화면에 띄울 때는 onPause()가 호출되는가? 참고로 권한 요청 다이얼로그라고 하면 아래 그림과 같으며 많이 봐보셨을 겁니다. Dangerous Permission을 부여해야 할 때 런타임에서 권한 체크를 하는 것입니다. Permission (Normal, Dangerous) 관련해서는 아래 리스트 참조 https://stackoverflow.com/questions/36936914/list-of-android-permissions-normal-permissions-and-dangerous-permissions..
[소셜로그인] 안드로이드 애플 로그인(Sign in with apple) 구현하기 3편 안녕하세요! 허접 샴푸입니다. 요새 통 바빠서 포스트를 작성하지 못했습니다. 이번 편은 안드로이드에서 애플 로그인을 구현하기 위해 필요한 안드로이드 앱 쪽을 살펴보겠습니다. 거두절미하고 어떻게 구현하는지 바로 알아보도록 하겠습니다. [START] 1. Const.kt 작성 (상수 설정) [APPLE_CLIENT_ID] APPLE_CLIENT_ID는 https://developer.apple.com/account/resources/identifiers/list/serviceId로 들어가면 IDENTIFIER이라고 되어있는 놈의 값입니다. [APPLE_REDIRECT_URI] APPLE_REDIRECT_URI는 1편에서 말씀드린 Return URLs에 작성한 주소를 적습니다. 2. Interaction.kt..