분류 전체보기

Android/Interview Question

Blocking, NonBlocking, Sync, Async 이해하기 좋은 아티클

https://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/#about Blocking-NonBlocking-Synchronous-Asynchronous 꽤 자주 접하는 용어다. 특히나 요즘들어 더 자주 접하게 되는데, 얼추 알고는 있고 알고 있는게 틀린 것도 아니지만, 막상 명확하게 구분해서 설명하라면 또 만만치가 않은.. 그래서 찾아보면 homoefficio.github.io 본문의 정리를 인용하면, Blocking/NonBlocking은 호출되는 함수가 바로 리턴하느냐 마느냐가 관심사 바로 리턴하지 않으면 Blocking 바로 리턴하면 NonBlocking Synchronous/Asynchronous는 ..

Android/Today I Learned

Material library 1.5.0 로 올리니 크래시가?!

해당 글에서는 AOSP 코드와 Material 코드를 보며 어떤식으로 에러를 수정하였는지 전달하고, 혹시나 AOSP 코드 등을 확인해야한다면 어떤식으로 접근할지 도움을 드리기 위해 작성하는 글입니다. 배포를 하기 위해 새로 개발된 Feature 들을 머지하고 QA 를 하던 도중 아래와 같은 에러가 발생하였습니다. MaterialCardView 에서 발생하고 있었고, 특징으로는 Android 9 이하의 버전들에서 발생하고 있었습니다. 먼저 사용하는 쪽의 코드를 간략하게 확인하였습니다. (checked 에 들어가는 값은 viewModel 을 통해 넣어주고 있고 회사 코드가 드러날 수 있어 제거하였습니다) 이전에 문제 없이 잘 동작했기 때문에 한눈에 어떤 것이 문제 인지 알수가 없었습니다. 또한 코드가 변경된..

Android/Today I Learned

Compose 버튼 사이즈 관련 Tips

Button(IconButton, RadioButton, Switch....) 대부분의 Component 에서 minimumTouchTargetSize() 함수가 내부에서 처리되는 것을 볼 수 있습니다. 잠시 함수를 보면, 48 dp 보다 작은 경우 Component 자체에 Padding 이 들어가게 됩니다(ContentPadding 을 0 으로 줘도 Component 밖으로 Padding 이 생깁니다). 따라서 48 보다 더 작은 값을 넣고 싶은 경우, 내부에 코드들을 모두 복사해서 minimumTouchTargetSize 함수를 제거해줘야 합니다. 혹은 아래와 같이 minimumTouchTargetEnforcement 를 false 로 변경하여 처리할 수도 있습니다. CompositionLocalPr..

Android/Development Tips

2.4.1 이상 버전에서 Navigation Component 사용할 때 주의점

관련 문구 https://medium.com/androiddevelopers/navigation-multiple-back-stacks-6c67ba41952f Navigation: Multiple back stacks Welcome to another article in the second MAD Skills series on Navigation! In this article we’ll take a look at a highly requested feature… medium.com 관련 레포지토리 (NavigationAdvancedSample) https://github.com/android/architecture-components-samples/tree/master/NavigationAdvancedSa..

Android/Development Tips

DataStore Protocol Buffer 사용시 Tips

회사에서 필요해서 사용한 후기를 간단하게 적어둡니다. 불편했던 점 1. 사용시에 .proto 파일이 변경되면 빌드가 필요했습니다. 2. Map 같은 구조가 아니기 때문에 여러개 필요하다면, DataStore 객체를 만들어 낼 때, FileName 을 변경하여 처리했습니다.(물론 같은 이름으로 동시에 열수 없도록 처리되어 있습니다) 장점 1. 사용하기가 편합니다. 2. 빌드 이후 Generate 되는 코드를 보며 코드를 작성하면 되서 큰 어려움이 없었습니다. 아래와 같은 데이터 형식을 저장한다고 하면 val foodStores = listOf(FoodStore(....), FoodStore(....), FoodStore(....) ....) data class FoodStore( val name: Stri..

Android/Today I Learned

Compose Navigation - viewmodel 사용할 때 주의할 점

회사 선임분에게 감사의 인사를 최근에 Compose 에서 viewModel 을 파라미터로 넘겨서 사용할 때, 편의를 위해 compositionLocalOf 메서드를 사용하여 같은 Composable Scope 안에서는 currentViewModel() 과 같이 호출하여 당시에 제공하는 Composable Scope 에 맞는 ViewModelStoreOwner 를 넣어주고 viewModel 을 사용할 수 있도록 구성하여 사용하고 있습니다. compositionLocalOf 를 사용할 때, Theme 등의 전파의 개념에만 사용하는 것을 구글 가이드에서는 추천하고 있기 때문에, Interface 형식(AAC 의 의존성도 제거할겸)으로 만들어 사용하고 있습니다. 별문제 없이 사용하다가, 특정 상황에서 curre..

Android/Development Tips

알고 계시나요 Fragment 가 복원되는 시점?

A Activity 에 B Fragment 가 있는 상황에서 A Activity 의 복원이 일어나면, A Activity 의 onCreate 보다 B Fragment 의 onViewCreated 가 먼저 호출됩니다. (정확하게는 A Activity super.onCreate 호출 -> B Fragment 의 onViewCreated 호출 -> A Activity onCreate 호출로 진행됩니다) 따라서 A Activity onCreate 에서 어떤 값을 초기화해주고, B 의 onViewCreated 에서 무언가에 접근하는 코드가 있다면 크래시가 발생하게 됩니다. 복원이 아닌 일반적인 경우는 A activity onCreate 이후 B Fragment onViewCreated 가 호출됩니다. 문제가 생겼..

Android/Development Tips

BroadcastReceiver 사용할 때 유의점

BroadcastReceiver 를 상속 받아 사용할 때, 마치 싱글턴으로 관리 될 것 처럼 생겼지만, hashCode 찍어보면 매번 생성되는 것을 알 수 있다. 따라서 AppWidgetProvider 를 상속 받아 사용할 때 멤버 변수에 값을 저장하고 사용하는 방식등은 초기화 되기 때문에 조심해야한다. 위젯 좋은 예제

Android/Today I Learned

Android Font 고군분투기

몇일전 기능 구현후 테스트 하는 과정에서 Font 관련 함수에서 특정한 상황에 크래시가 나는 상황을 경험했습니다. 멋진 팀원들의 도움을 받아 어떤식으로 해결하였는지 공유합니다. 크게 1. 왜 크래시가 났는지? 2. 왜 간헐적으로 났는지? 3. 크래시가 나지 않았을 때는 어떤 클래스에서 이를 해소해주고 있었는지? 에 대한 내용으로 구성됩니다. 문제가 생긴 함수는 아래와 비슷한 식의 Font 의 id 를 가져와서 적용해주는 코드였습니다. // 예시 함수 fun TextView.setFont(@FontRes fontRes: Int) = apply { typeface = ResourcesCompat.getFont(context, fontRes) } 크래시 재현 상황은 앱 시작하자마자 특정 화면으로 이동하거나, ..

Nanamare
'분류 전체보기' 카테고리의 글 목록 (7 Page)