목록분류 전체보기 (392)
HTD
KTS and version catalog make our gradle file clear. And KTS's mainly used in modern android projects like Sunflower, nowinandroid. I used them to clear my gradle files and to practice Kotlin DSL. Let's see below images. The left one is my old gradle file, and the right one is the new one. This article covers how I migrated gradle files using KTS, version catalog. Migrating to KTS 1. Rename gradl..
Using test rules can help you write more efficient and effective tests, and can save you time by automating common testing tasks. And @Rule annotation is used to declare the test rule in JUnit. But in sunflower created by Google Android, @get:Rule is used instead of @Rule. In Kotlin, properties are compiled to getter and setter in Java, rather than public fields. So we need to apply the @Rule an..
I released FiveStarsView which is a custom view for a touchable star rating view with customizable stars. With FiveStarsView, you can draw a custom view with touchable five stars, apply Two-way data binding to the view, and modify the image, color, size, and the like of those stars. And I'd like to talk about the contents below: How the custom view's implemented Two-way data binding with custom ..
이번 포스트에서는 Google Android팀의 nowinandroid가 어떻게 구성되어 있는지 살펴봅니다. 특히 Clean Architecture, Multi Module이 어떻게 적용되어 있는지를 중심으로 살펴보겠습니다. Why nowinandroid? 시작하기에 앞서, nowinandroid(이하 'nia')는 Android팀에서 가장 활발하게 개발하고 있는 인기 있는 프로젝트입니다. Google에서 Compose의 도입을 매우 권장하고 있고 이를 크게 밀어주고 있는 추세인데, nia는 이러한 Compose로만 개발한 앱입니다. 최신 아키텍처도 잘 담고 있어, 이 리포지토리만 공부해도 Clean Architecture, Multi Module, Compose라는 세 마리 토끼를 다 잡을 수 있다고 ..
구현 결과 1. Touch to move 터치하여 움직이기를 구현하기 위해 저는 setOnTouchListener()를 다음과 같이 적용하였습니다. // 이동 var startTouchX = 0.0f var startTouchY = 0.0f var startPoseImageX = 0.0f var startPoseImageY = 0.0f binding.root.setOnTouchListener { _, event -> when (event.action) { MotionEvent.ACTION_DOWN -> { startTouchX = event.x startTouchY = event.y startPoseImageX = binding.imagePose.x startPoseImageY = binding.imag..
배경 val outputStream: OutputStream = FileOutputStream(imageFile) bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream) outputStream.flush() outputStream.close() 위와 같은 코드로 /Pictures/AppName 같은 루트에 이미지를 저장을 하고 갤러리 앱에 들어가보면, 저장된 사진이 그 즉시 보여지지 않습니다. 갤러리 앱에 보여지는 데 1~3분 정도가 소요되곤 하여 앱을 사용하기에 매우 불편하였습니다. 해결 과정 원인 및 해결책을 찾을 수 있었던 과정은 다음과 같습니다. 1. SNOW 앱은 즉시 사진이 갤러리에 보여지기 때문에, 혹시나 저장되는 위치가 잘못된 것인지 ..
서론가장 인기있는 MVVM 및 Clean Architecture를 Retrofit2, Hilt, Recycler View와 함께 쓴 매우 간단한 repository를 작성하였고, 이에 대한 설명이 이 글의 주요 내용입니다. 위 내용들을 실제 예시 코드를 통한 빠르게 학습하고자 하시는 분들이 타겟입니다. 이 프로젝트의 앱은 OpenAPI(https://reqres.in/) 서버와 통신하여 유저 리스트를 READ하고 이를 RecyclerView에 표현하는 내용의 앱입니다. https://github.com/hanbikan/recycler-view-with-mvvm-hilt-retrofit2 GitHub - hanbikan/recycler-view-with-mvvm-hilt-retrofit2: An examp..
서론 해당 프로젝트를 하면서 객체지향, 클린 아키텍처, MVVM과 관련된 고민이 많았습니다. 그 과정에서 코드를 뒤엎는 리팩토링이 정말 많았는데, 그 과정을 기록한 내용입니다. (해당 글의 내용은 좋은 코드를 위한 과정일 뿐 정답이 아니란 점..!) [PICK-70] 클린 아키텍처 적용 기존에 네이밍(item, model)도 혼재되어 있었고 레이어 또한 제대로 구분되지 않은 채로 방치되어 있었습니다. 게다가 translator에서 책임을 져야할 내용(entity 혹은 dto를 model로 변환시키는 로직)을 repository가 처리하고 있었습니다. 이러한 많은 문제점을 아래 사진과 같은 클린 아키텍처를 적용함으로써 해결하였습니다. 기존의 더러운 코드로 인해 불편함을 겪다가 적용을 하니 각 영역이 왜 필..
배경Splash Screen에서 특정 작업을 마친 후에 앱으로 진입하게 되는데, 이 시간이 너무 긴 것처럼 느껴져서 개선을 진행하게 되었습니다.분석먼저 SplashActivity의 코드를 분석해보았고, 다음과 같은 사실을 알 수 있었습니다.API 호출과 Kakao Login 작업에서 가장 큰 시간 소요가 있었습니다.두 작업이 순차적으로 진행되고 있었습니다.따라서 두 작업을 병렬로 처리하는 것이 포인트입니다.병렬 처리사실 여러 개의 suspend function(Non-blocking)을 병렬로 처리하는 것은 awaitAll() 함수만 사용하면 꽤 쉽게 처리할 수 있습니다. 하지만 저의 경우에는 Kakao Login을 사용하고 있었고, 카카오에서 콜백 함수로 비동기 처리를 제공하고 있었습니다.(Asynch..
배경 모바일 어플리케이션의 매우 치명적인 단점 중 하나는 바로 업데이트입니다. 사용자 입장에서 앱을 업데이트하는 것은 매우 귀찮은 일이어서 잘 하려고 하지 않습니다. 따라서 어떻게 하면 업데이트를 최대한 줄이고 앱을 개선해나갈 것인지에 대해 고민해야 합니다. Rich Text를 사용하면 앱을 업데이트되지 않더라도 TextView의 내용은 물론이고 스타일, 색상, 크기를 변경할 수 있으며 심지어 이미지까지 첨부할 수 있습니다. 단 1개의 TextView만으로 위와 같은 결과를 낼 수 있습니다. 이렇게 디테일한 내용을 앱 업데이트 없이도 적용할 수 있습니다. Server Driven UI를 구현함으로써 이를 적용할 수 있으며, 서버에서 텍스트의 디테일한 attribute를 보내준다는 가정 하에 구현이 가능합..