Android

Android/Development Tips

ViewModel 에서 Fragment, Activity 로 콜백을 조심하자

ViewModel 의 라이프 사이클은 Activity 나 Fragment 보다 길기 때문에 ViewModel 에서 Fragment, Activity 에 콜백 받는 것은 실수를 유발합니다 (ViewModel 에서든) 라이브데이터나 플로우를 사용하여 관찰(observe) 혹은 수집(collect) 하는 것이 좋습니다. // Activity or Fragment.kt viewModel.loadItemList() { list -> // Activity 가 Destroy 상태거나 Fragment 인 경우 not Attached 일 수 있음 // 또한 isDestroyed 혹은 isAdd 와 같은 상태를 확인하는 처리가 필요하게 됩니다 adapter.submitData(list) }

Android/Today I Learned

멀티 모듈에서 Missing required view with ID 에러 해결

몇일전 일을 하는 도중 아래와 같은 이슈를 만났습니다. Fatal Exception: java.lang.NullPointerException Missing required view with ID: com.{package}.debug:id/{resource_id} ViewBinding 을 사용하고 있는데, xxxxBinding 클래스에서 해당 아이디를 찾지못하는 이슈였습니다. 해당 레이아웃 파일에 들어가서 확인해보니, 아이디가 잘 선언되어 있고, ctrl + 클릭 조합으로도 리소스가 잘 이어져있는 것을 확인했습니다. 잠시 등에 땀이 흐를뻔했지만, 혹시나해서 같은 바인딩 클래스가 있는지 확인해봤습니다 . A 모듈에서 xxxxBinding 클래스가 사용되고 있었고, B 모듈에서도 xxxxBinding 클래스가..

Android/Development Tips

Google login errorCode 12500 인 경우

먼저 1. Firebase console -> 설정 -> 내프로젝트 항목에서 지원 이메일이 제대로 등록되어있는지 체크하기 2. Firebase console -> 설정 -> 내 앱 항목에서 SHA-1 타입의 인증서가 잘 추가가 되어있는지 체크하기 3. Debug 앱 등이 있어도 BuildType 에 맞게 들어있다면 google-services.json 에 모두 담겨 오기 때문에 크게 문제 없습니다. 4. 이모든게 모두 잘 되어 있다면 Google 사용자 인증 정보에 들어가서 OAuth 2.0 클라이언트에 해당 앱의 패키지 혹은 디버그 버전 패키지가 잘 추가되어 있는지 확인 하기 저는 4번 케이스로 보통은 google 에서 자동으로 추가시켜주는데(키에 was created auto by google 식으로..

Android/번역

LiveData, Coroutine, Flow 를 이용한 반응형 UI - Part 3

LiveData, Coroutine, Flow 를 이용한 반응형 UI - Part 1 LiveData, Coroutine, Flow 를 이용한 반응형 UI - Part 1 https://medium.com/androiddevelopers/livedata-with-coroutines-and-flow-part-i-reactive-uis-b20f676d25d7 LiveData with Coroutines and Flow — Part I: Reactive UIs This article is a summary of the t.. nanamare.tistory.com LiveData, Coroutine, Flow 를 이용한 반응형 UI - Part 2 LiveData, Coroutine, Flow 를 이용한 반응형..

Android/번역

LiveData, Coroutine, Flow 를 이용한 반응형 UI - Part 2

LiveData, Coroutine, Flow 를 이용한 반응형 UI - Part 1 Jetpack 에서 제공하는 AAC 는 안드로이드 개발에 간편한 기능들을 제공합니다. 따라서 코루틴의 작업 및 취소(Jobs and cancellation)들에 대해서 걱정할 필요가 없습니다. 단순히 작업의 범위(scope of operation)를 잘 선택해주기만 하면 됩니다. 다양한 스코프에 대해 알아봅시다! ViewModel Scope 해당 스코프는 코루틴을 사용할 때 가장 많이 사용하는 스코프중 하나입니다. 보통 ViewModel 에서 데이터 관련한 작업들이 시작되기 때문입니다. 따라서 viewModelScope extension 을 사용하면, ViewModel 의 onCleared 메서드가 호출될 때 자동으로 ..

Android/Development Tips

Proguard 로 난독화 된 코드 복호화

앱 개발을 하다보면, Proguard 를 적용하게 되고 이로인해, 간혹 crashlytics 혹은 google console 에 난독화가 적용된 코드가 전달 되는 경우가 있습니다.(AAB를 적용하게되면, Mapping 파일을 따로 추가하지 않아도 되지만, 난독화된 코드들이 Crashlytics 에 기록되는 경우가 있었습니다.) 따라서 해당 코드라인을 수정하려면 de-obfucated 가 필수 입니다! 매번 잊어버려서 이후에 참고할 수 있게 블로그에 정리해둡니다. 1. $ANDROID_SDK_DIRECTORY/tools/proguard/bin/proguardgui.sh 실행 ANDROID_SDK_DIRECTORY 는 안드로이드 스튜디오를 켜고, local.properties 의 sdk.dir 를 참고하시면..

Android/번역

LiveData, Coroutine, Flow 를 이용한 반응형 UI - Part 1

https://medium.com/androiddevelopers/livedata-with-coroutines-and-flow-part-i-reactive-uis-b20f676d25d7 LiveData with Coroutines and Flow — Part I: Reactive UIs This article is a summary of the talk I gave with Yigit Boyar at the Android Dev Summit 2019. medium.com 해당 글은 아래 링크의 번역본 입니다. 따라서 의역 오역이 있을 수도 있습니다. Part 1: 반응형 UIs 안드로이드 초기부터, 엣지 케이스가 가득한 안드로이드 생명주기 을 이해하는 것은 매우 어렵다는 것을 잘 알고 있습니다. 그래서 ..

Android/Development Tips

Bitmap, contentUri 를 Retrofit RequestBody 에 담을 때 Tips

보통 Retrofit 를 통해 RequestBody 를 만들어 서버로 보낼 때, Bitmap -> file 저장 -> file 을 RequestBody 로 변경하여 서버로 보내는 예제들이 간혹 보입니다. contentUri 도 마찬가지로 file 로 저장하고 RequestBody 로 변경하여 서버로 보내곤합니다. 그리고 코드도 올바르게 동작합니다. 하지만 해당 과정에는 파일로 저장할 필요가 없는 케이스도 있습니다. 해당 케이스의 경우 아마 위의 방식을 사용하면 이후에 파일을 삭제하는 로직 혹은 버전이 올라가면 해당 파일을 포함한 폴더를 비워주는 작업들이 필요하게 됩니다. 이런 경우 불필요한 파일 IO 작업을 생략할 수 있는 방법들이 있습니다. 1. Bitmap 의 경우 class BitmapRequest..

Android/Development Tips

Hilt 수박 겉핥기

www.youtube.com/watch?v=gkUCs6YWzEY 앞으로 Hilt 를 사용할 것 같은 느낌이 강하게 들어, 드로이드 나이츠 2020 옥수환님이 발표하신 영상 보면서 정리해봤습니다 Dependency Injection(의존성 주입) 이란 ? - 생성자 또는 메세드 등을 통해 외부로부터 생성된 객체를 전달받는 행위 의존성 주입의 특징? - 클래시간 결합도를 느슨하게 만든다 - 인터페이스 기반으로 설계되며, 코드를 유연하게 변경 가능하도록 한다 - Stub 또는 Mock 객체를 사용하여 단위 테스트를 하기가 더욱 쉬워진다 간단한 예제코드 // 의존성 주입이 없는 코드 class MemoRepository { private val db = SQLiteDatabase() fun load(id: St..

Nanamare
'Android' 카테고리의 글 목록 (5 Page)