Android/Common

Android/Common

[Android] 뷰의 성능 개선 - RecyclerView

들어가기 전 이번 포스팅에서는 Android 앱에서 가장 많이 사용한다고 볼 수 있는 RecyclerView의 성능 개선에 대해서 알아보자. 하지만 먼저 알아야 할 도구가 있다. 바로 GPU 렌더링 막대기 개발자 옵션 -> 프로필 GPU 렌더링에서 킬 수 있는 이 기능은 기기의 렌더링 상황을 시각적으로 확인하여 어느 부분에서 지연이 되고 있는지 알 수 있다. 아래는 예시 사진으로 왼쪽은 갤럭시 설정 앱, 오른쪽은 필자가 만든 WASK 앱이다. 가로 막대기 안드로이드는 초당 60fps를 가져야 사용자는 부드럽다고 느낀다. 프레임 기준으로 계산해보면 1000ms / 60 fps = 16.66...로 프레임 하나당 16ms내에 생성돼야 한다. 가로 막대기는 16ms를 뜻한다. 세로 막대기 세로 막대기는 한 프..

Android/Common

[Android] 뷰의 성능 개선 - 오버드로 줄이기

애니메이션의 프레임과 비슷하게 안드로이드의 화면도 여러 개의 프레임들이 순차적으로 그려지고 완성되어 사용자에게 보이는 과정을 거칩니다. 초당 프레임 수가 많아질수록 사용자는 부드럽게 느낍니다. 그런데 이상하게 유명한 앱과 달리 자신이 만든 앱이 버벅거린다는 느낌을 받은 적이 있나요? 답은 뷰를 그리는 과정 속에서 여러분들의 불필요한 코드와 로직에 의해 하나의 프레임을 그리는 속도가 느려지게 되는 것입니다. 결과적으로 초당 프레임 수가 낮아지고 사용자는 버벅거린다는 느낌을 받게 됩니다. 이번 포스팅에서는 한 픽셀을 여러 번 그리는 오버드로에 대해서 알아보겠습니다. 문제점들 View Groub의 중첩으로 발생할 수 있는 오 버드로 LottoLike 일부분 코드입니다. 자세히 보시면 자식인 RelativeLa..

Android/Common

[Android] Drawable color 속성을 코드로 변경하기

이제까지 색상별로 Drawable를 생성했었는 데 너무 비효율적이더라구요 코드상으로 color를 변경할 수 있습니다. 코드로 Drawable 속성 변경하기 val drawable : Drawable = imageview.drawable val color = ContextCompat.getColor(mContext,R.color.colorToSet) if (drawable is ShapeDrawable) { drawable.paint.color = color } else if (drawable is GradientDrawable) { drawable.setColor(color) }

Android/Common

[Android] MVP 적용해보기 - View와 Presenter

MVP Architecture MVP는 Model과 View, Presenter로 나누는 패턴이다. MVC와 비교하여 View와 Model이 서로 존재를 몰라 의존성이 줄어든다. 이말은 쉽게 View와 Model 클래스를 변경, 수정할 수 있고 MVC에 비해 Model 클래스의 유닛 테스트를 쉽게 시도할 수 있다. Model Local DB, Remote DB, sharedPreference .. 등 데이터를 수정, 관리하는 Class Presenter 사용자의 액션을 받아 로직을 처리하고, Model에게 Data 변경을 요청하거나 UI 업데이트하는 로직을 처리하는 Class ViewContract : View and Presenter의 설계 사용자 액션을 Presetner에 떠넘기고, UI 업데이트하는..

Android/Common

[Android] Executor - 기능 별 Thread 분리

최근 Google Architecture MVP Sample project를 참고하여 MVP를 공부하던 도중 Executor의 클래스를 처음 보게 되었다. 그 후 구글링을 통해 네트워크 IO 통신과 디스크 IO 작업, UI 작업등 Background 작업을 위해 해당 클래스가 사용되었고 kotlin의 coroutine이 출시되기 이전 Thread를 유용하게 사용한 방법이었다. - Executor Inferface import java.util.concurrent interface Executor { void execute(Runnable command); } 구조로만 보면 Runnable 객체를 실행하는 단순한 구조이다. 클래스 자체로 어떤 Background 프로세스가 생성되는 것이 아닌 틀만 제공해준..

Android/Common

[Android] MVC 적용하기

해당 포스팅의 코드와 설명에 오류가 있다면 댓글로 말해주시면 감사하겠습니다. 며칠 전, 출시 된지 꽤 지난 어플이 사용하던 API 서버 호출 오류로 내부 로직이 꼬여 먹통이 되어 버렸다. 해당 프로젝트는 기능 동작만 생각하던 옛날의 내가 Ctrl + c, Ctrl + v를 수행한 중복 코드도 많고 매우 비효율 적으로 구현한 작품. 다시금 스스로 작성한 코드를 보면서 디자인 패턴의 중요성을 느끼고 가장 기초적인 MVC 패턴부터 적용하기로 마음을 먹었다. Model-View-Controller 패턴 프로젝트의 기능과 비례하게 코드의 양이 늘어난다. 디자인 패턴을 적용하지 않은 프로젝트는 Activity 클래스 파일에 모든 코드가 들어가 있고 해당 클래스 파일의 코드의 수는 몇 천줄이 되어 어떤 한 기능을 수..

Android/Common

[Android] 내부 DB - Room

로컬 디바이스에 데이터를 저장하는 방식을 SQLite를 사용하고 있다가 요즘 유명한 AAC인 Room을 공부해보려고 합니다. Room은 SQLite를 내부적으로 사용하고 있어 기능적으로 동일하지만 데이터베이스를 구조적으로 분리하여 편리한 데이터 접근과 유지 보수의 유연성을 높여줍니다. 하지만 어노테이션을 사용하여 관계를 정의하므로 안드로이드에 익숙하지 않다면 복잡하게 느껴질 수도 있습니다. 들어가며 이 포스팅은로 필자의 개인 프로젝트에서 사용자의 계정을 저장하는 Account Database를 Room으로 구현하는 방법에 대해 필요한 코드만 간추려서 작성한 글입니다. 구현하고자 하는 기능, 요구에 따라 구조가 달라 질 수 있으니 참고정도로만 생각해주시면 감사하겠습니다. build gradle depend..

Android/Common

[Android] Google Calendar API 사용법

Google Cloud Calendar API 설정 Step 1. 구글 콘솔 사이트 들어가기 Step 2. 프로젝트 만들기 Google Cloud Platfrom 에서 프로젝트를 생성해야 해당 Project ID를 통해 Calendar API 등 여러 API를 사용할 수 있습니다. Step 3. 프로젝트 이름을 입력하고 만들기를 눌러주세요. Step 4.라이브러리에서 Google Calendar API 설정 Step 5. 인증정보 만들기 사용자 인증 정보 만들기 위해 OAuth에 대해 사용자에게 동의를 구할 때 나오는 화면을 설정해 주어야 합니다. Google Cloud Platform G Suite 계정이 아니면 내부 User Type 선택이 불가능 하므로 외부로 설정합시다. 동의화면은 외부만 선택이 ..

Android/Common

[Android] 바인딩 서비스로 음악 재생

이 포스팅은 Music Player 재생의 간단한 로직을 FLO 앱 챌린지에 맞춰 개발한 내용에 대해 제 생각을 정리한 글입니다. 부족한 부분이 있으면 댓글로 알려주시면 감사하겠습니다. 멜론 어플을 사용한 유저라면 다른 어플을 사용 중에도 음악이 재생되는 것을 알 수 있을 것이다. 이는 음악이 Service에서 무한히 재생이 되고 있다는 뜻. 보통의 Service는 어떠한 값도 반환하지 않고 서비스를 종료하는 요청 외에 외부 서비스 내 함수에 접근할 수 없다. 그런데 음악이 재생되고 있는 도중 멜론 앱을 다시 키면 현재 재생되고 있는 곡의 정보를 바로 보여준다. 왜? 답은 Bound Services 이다. Service와 Activity의 관계과 서버와 클라이언트 관계가 된 것처럼 Activity는 Se..

Android/Common

[Android] DataBinding 정리

본 포스팅은 꾸준히 수정됩니다~ findViewById(R.id.sample_text).apply { text = viewModel.userName } //또는 sample_text.text = viewModel.userName 전체 프로젝트의 코드 중 UI의 데이터를 변경해주는 코드의 양이 적지 않다. DataBinding을 사용하면 불필요한 UI 변경 코드를 줄이면서 데이터를 변경할수 있고 메모리 누수 방지와 NPE 방지 등 좋은 점들이 많다. 예를 들어, 부모 레이아웃안에서 TextView를 찾아 viewModel의 userName 값을 대입해주는 코드도 DataBinding을 사용하면 xml에서 똑같은 기능을 구현할 수있다. 변경 후 .. activity_main.xml DataBinding 추가..

점냥
'Android/Common' 카테고리의 글 목록 (4 Page)