일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 회원가입
- XML
- sharedFlow
- 로그인
- 플레이스토어
- Build variants
- Android
- UiState
- ListAdapter
- 파이어베이스
- cleanarchitecture
- Flow
- DiffUtil
- 안드로이드
- NavController
- 클린아키텍처
- Compose
- Kotlin
- Authentication
- 알고리즘
- 커스텀뷰
- 코딩테스트
- Jetpack
- coroutine
- 코틀린
- 뷰
- NavHost
- MVVM
- 컴포즈
- 리사이클러뷰
- Today
- Total
목록안드로이드 (45)
Grusie 안드로이드 개발 기술 블로그

웹뷰를 활용한 페이지를 새로 만들어 테스트를 완료하고, release버전으로 내부테스트 배포를 하게 되었다.기본 동작은 웹뷰에서 Json을 받아와 Gson 라이브러리를 활용하여 해당하는 모델로 파싱을 해주고, 그 모델을 가공하여, Unity 라이브러리에 전달하는 형태였으나, 어째서인지 배포를 한 뒤 부터 Unity 모듈의 초기화가 실패하는 현상이 발생했다. 원인 분석release버전이기에, 세세한 Log를 보지 못 했고, 로그인 정보를 넘겨줄 때 문제가 있을 것이라는 추측만 할 수 있었다. 로그인 정보가 잘 못 되었나를 고민하였으나 Shared Preferences 같은 경우도, debugging 모드일 때에만 안드로이드 스튜디오에서 볼 수 있었고, release를 debuging 모드로 뽑아서 할까 하..
플레이 스토어에 출시된 앱의 버전 업데이트를 관리 할 때에는 몇 가지 방식이 있다.1. 강제 업데이트2. 선택적 업데이트3. 인앱 업데이트 우선 우리 회사의 경우 사용자 경험에 있어 최대한 강제 업데이트를 시키는 것을 권장하지 않는 주의이다.그렇기에, 크리티컬한 오류가 있는 버전이 아니라면 강제 업데이트를 진행시키지 않는다. 그랬을 때의 로직을 생각해보자.1. 서버 통신을 통해, 강제 업데이트를 진행해야 하는 최소 버전을 받아온다.2. 만약 이 버전보다 낮다면, 강제로 업데이트를 진행하도록 해야한다.3. 이 버전보다 높다면, 플레이스토어의 버전과 비교를 한다. 업데이트가 가능하다면 선택적 업데이트 다이얼로그를 띄워준다.4. 만약 나중에 하기를 선택했을 경우, 1주일 뒤에 다시 다이얼로그를 띄워준다. 이런..

리사이클러뷰 단일 체크에 대해 고민해보았다. onBindViewHolder에서 처리를 하였더니, 깜빡임이 발생해 찾았던 방식이 payload였고, 회사 프로젝트에도 적용을 한 적이 있었다. DiffUtil은 리사이클러뷰의 아이템 추가/수정/삭제 등을 진행하여 변경사항을 알릴 때 기존 notifyDataSetChanged 를 사용했을 때에 비해, 성능면에서 좋다는 것만 생각하고 있었으니 조금 더 공부를 해보게 되었다. 기존 노션 페이지에서도 한 번 정리해둔 적이 있으니 참고하면 좋을 것이다.https://grusie.notion.site/6d922ec6b7b746d0aa15a0b9a4a953a5?pvs=4 안드로이드 공부 | Notion이론 공부grusie.notion.site DiffUtil이란?리사이..

기존에 미라클알람 프로젝트를 진행하며 데이터바인딩에 대해 찍먹 정도는 해 본 적이 있다. 그 때는 잘 모르는 상태로 진행하여 코드도 난잡하고 사용하기 힘들었었고, 회사 프로젝트에 사용하려고 해 보았으나, data binding이 패키지명에 대문자가 있으면 에러가 나는 것 같았다. 하필 회사 프로젝트의 패키지명이 대문자로 되어있어 적용을 포기했었던 것 같다. 그 이후로 뷰바인딩만 사용하였고, 컴포즈 공부를 하면서, Data binding을 서서히 잊어갔다... xml의 사용을 줄이기위해 컴포즈로 공부하고 있었는데, 데이터바인딩은 오히려 XML에서 로직까지 사용하여 분리가 불가능 하게 될 것이라는 생각 때문이였다.그러나 이번에 메모리즈 프로젝트를 진행하는데, 기존에 계셨던 분이 데이터바인딩으로 코드를 구현 ..

늘 Coroutine을 사용하여 suspend함수로 레트로핏의 결과를 반환해주고, try-catch {}로 묶어서 에러 핸들링을 하였다.그러던 와중 CallAdapter라는 클래스를 알게 되어서 적어보려고 한다.Retrofit2 빌더 패턴에서, 확장함수를 보다보면, addCallAdapterFactory() 라는 메서드가 존재한다.응답을 받았을 때, callAdapterFactory에서 원하는 타입으로 리턴해주는 형태로 작업을 하기에, 코틀린의 Result를 사용하거나 임의로 만든 sealed class를 사용할 수 있을 것 같다.CallAdapter를 사용했을 경우 통신에 대한 try-catch{} 지옥을 겪을 일이 없어 코드가 깔끔해진다. 사용법CallAdapterclass CustomCallAdap..

의존성 관리를 위해 기존에 사용하던 방식은 buildSrc를 만들어 공용으로 사용하도록 관리하였었다. 얼마전 드로이드나이츠에서 버전 카탈로그에 대한 발표를 들었는데, 저렇게도 관리 할 수 있구나 하는 생각과 함께 직접 한 번 적용해 보려고 한다.https://www.youtube.com/watch?v=zQAGIQzOJcg buildsrc와 version catalog의 차이- buildSrc플러그인들을 작성하기 쉽다.라이브러리 업데이트 정보를 알 수 없다. ( 별도의 라이브러리를 쓰면 해결은 된다. )코드상에서 버전을 하나만 바꿔도 캐시를 무시하고 전체를 다시 빌드한다.- version catalog버전을 깔끔하게 관리할 수 있고, bundle 형태로 묶어서 관리할 수도 있다.라이브러리 업데이트 정보를..
이미지에 관한 코드들을 구경하다가, 화면에 이미지를 원하는 위치에 원하는 크기, 회전에 따라서 보여주고 싶을 때가 있었다.직접 구현해 본 적이 없어서, 라이브러리가 어딘가에 있지 않을까 했었는데, 커스텀 뷰로 만든 것을 보고 흥미로워서 분석한 내용을 작성해 보려고 한다. 생성자class CustomRotateImageView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, private val imageInfo: ImageVo = ImageVo(),) : FrameLayout(context, attrs) {}우선 커스텀 뷰이기에, 생성자를 만들고, xml layout에서 사용한다면, AttributeSet..
회사 기존 프로젝트에 이미지 로딩 라이브러리가 Facebook사의 Fresco로 개발이 되어있는 것을 발견하였다. SimpleDraweeView라는 뷰를 사용해야 하는 것 같았다. controller라는 것을 사용해서, 원하는 이미지 로드 빌드를 만들어서 넣어주는 형태이며, 사용하지 않을 때 null로 해주지 않으면 메모리릭이 날 수 있을 것이라고 판단했다. 필자가 기존에 사용해오던 라이브러리는 Google사의 Glide라는 라이브러리인데, 사용법이 간편하고, 제공하는 기능들이 많고 커스텀하기 좋았기 때문이다. 사용법에 대해서는 이 블로그를 참고하면 좋을 것 같다. https://bumjae.tistory.com/83 Fresco 프로젝트를 진행하다 webp 이미지 파일을 표현하기 위해 Fresco의 S..