mds_store의 CPU 점유율이 갑자기 치솟을 때

  아무것도 안했는데 갑자기 맥이 버벅이기 시작했다. ActivityMonitor를 띄워 CPU 점유율이 높은 프로세스 순으로 나열하니 mds_store가 점유율을 엄청나게 가져가고 있었다.  mds_store가 무엇인지 검색해보니 Spotlight관련 프로세스라고 한다. 아마 백그라운드에서 인덱싱을 하면서 점유율을 엄청 가져가는 것 같은데 잠자기 모드 일때 안하고 왜 지금하는지 모르겠다. 나는 알프레드를 사용하기 때문에 Spotlight는 사용하지 않는다. 그래서 더보기…

글쓴이 Charlezz,

Jetpack Compose의 등장배경을 알아보자.

Jetpack Compose는 네이티브 Android UI를 빌드하기 위한 최신 선언형 UI 툴킷이다. Jetpack Compose는 적은 수의 코드, 강력한 도구 및 직관적인 Kotlin API로 Android에서의 UI 개발을 간소화하고 가속화한다. Declarative UI Programming? 선언형 UI프로그래밍(Declarative UI Programming)은 기존의 명령형 UI 프로그래밍과 달리 View의 상태(State)만 선언하고 자세한 구현은 프레임워크에게 맡기는 방법을 의미한다. 왜 Compose가 더보기…

글쓴이 Charlezz,

LeakCanary로 메모리 누수 잡기

LeakCanary란? LeakCanary는 안드로이드를 위한 메모리 누수 감지 라이브러리다. 안드로이드 프레임워크 내부 이해를 통해 메모리 누수의 원인을 줄이는 기능을 제공하여, 개발자가 OOM(Out Of Memory)에러로 인한 크래시를 줄일 수 있도록 도와준다. 메모리 누수란? 애플리케이션이 더 이상 필요하지 않은 객체에 대한 참조를 유지함으로써 결과적으로 해당 객체에 할당 된 메모리를 회수 할 수 없어 더보기…

글쓴이 Charlezz,

MediaStore에 이미지, 비디오 질의 시간 비교 테스트

배경 다양한 질의를 통해, 가장 빠른 응답시간을 보이는 방법을 알아본다. 테스트 환경 Galaxy S9, 이미지 80507개, 동영상 29개 쿼리 타입 1번타입 – 파일 콘텐츠 Uri  + 이미지 타입만 거르기 contentResolver.query( MediaStore.Files.getContentUri(“external”), null, MediaStore.Files.FileColumns.MEDIA_TYPE + ” = ?”, arrayOf(“${MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE}”), null) 2번타입 – 이미지 콘텐츠 Uri  contentResolver.query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null 더보기…

글쓴이 Charlezz,

onLayout() 호출 시 PhotoView의 Matrix 상태가 보존 되지 않는 문제 해결

PhotoView의 문제점 PhotoView 라이브러리를 사용하다보니 레이아웃 변경시 매트릭스 상태가 보존되지 않는 버그가 있었다. 대안으로 SubsamplingScaleImageView 라이브러리는 레이아웃 변경시에도 상태가 유지되는 것을 확인했다.  하지만 난 PhotoView를 쓰고싶다. 문제되는 상황을 살펴보자. 위와 같은 화면을 만들고 있다. 화면을 클릭하면 window의 decorView에 접근하여 System UI를 hide/show 하고 있다. 하지만 decorView의 상태를 변경할 때마다 하위 더보기…

글쓴이 Charlezz,

Groupie로 RecyclerView를 쉽게 만들어보자!

Groupie로 RecyclerView를 쉽게 만들어보자! RecyclerView는 목록으로 구성된 화면을 만들 때 사용하는 아주 유용하고 강력한 위젯이다. RecyclerView는 거의 모든 앱에서 필수로 사용되며, 이를 구현하기 위해 어댑터, 뷰홀더 등과 같은 것들을 구현해야한다. 여러 화면에서 RecyclerView를 사용하는 경우가 많다. 이로 인해 보일러플레이트 코드가 많이 생기다보니 대부분의 개발자들은 추상화 된 코드를 작성하거나 Epoxy와 같은 더보기…

[제1회] 천하제일 안드로이드 퀴즈 대회

대회 결과 (축하드립니다 ㅋㅋ) 1위 갤럭시님 2위 Kenneth님 3위 안녕하세요님 천하제일 안드로이드 퀴즈 대회 코로나로 지쳐가는 하루하루를 극복하기 위해 자그마한 이벤트를 준비했습니다. ㅋㅋ 우승자에겐 스타벅스 커피 쿠폰 증정 및 명예의 전당(?) 등록의 영광까지..! 참여대상 안드로이드 앱 개발자(초보자 환영!) 최대 50명 참가 가능 참여일시 2021년 1월 24일 오전 11시 (일요일) 참여방법 더보기…

프레그먼트에서 DataBinding 또는 ViewBinding 사용시 메모리 누수와 해결방법

  프로젝트 팀원중 한분이 Databinding(or ViewBinding)과 관련된 메모리 누수를 LeakCanary를 통해 발견 했다고 리포팅해주셨다. 메모리 누수가 발생했다! DataBinding을 사용한지 벌써 꽤 많은 시간이 지났는데, 난 계속 메모리 누수 코드를 작성하고 있었던 것인가.. ViewBinding 공식 문서에 예제 코드를 살펴보면 다음과 같다. private var _binding: ResultProfileBinding? = null // This property is 더보기…

글쓴이 Charlezz,

Dagger2 사용 시, XXX is defined multiple times 에러가 발생한다면

Dagger2는 관련된 MembersInjector 및 Factory 패키지를 올바른 패키지 경로에 생성하게 된다. 다음 그림은 안드로이드 프로젝트의 모듈간 의존성을 보여준다. 만약 안드로이드 프로젝트가 멀티 모듈로 구성되어 있고 모듈별로 Dagger2 어노테이션 프로세싱이 수행된다면, 모듈별로 각자 생성된 클래스를 갖게 되므로 중복된 클래스를 갖게 된다. 이렇게 되면 debug 빌드시에는 이를  괜찮은 듯 보이나, 릴리즈 빌드시 더보기…

글쓴이 Charlezz,

Paging 3 라이브러리 완벽 가이드 (공식 문서 번역)

개요 페이징 라이브러리를 사용하면 로컬 저장소 또는 네트워크를 통해 큰 데이터를 잘게 쪼개어 로드하고 표시 할 수 있다. 이 방식을 사용하면 앱에서 네트워크 대역폭과 시스템 리소스를 더 효율적으로 사용할 수 있다. Paging3 라이브러리 컴포넌트 Android 앱 아키텍처에 맞게 설계되고 다른 Jetpack 구성 요소와 깔끔하게 통합되며 Kotlin 우선 지원을 제공한다. 장점 더보기…

글쓴이 Charlezz,