728x90

android

    [Kotlin] MutableSharedFlow의 tryEmit()이 실행되지 않을 때

    SharedFlow는 코루틴에서 쉽게 사용할 수 있는 Hot Stream입니다. 안드로이드에서는 뷰모델에서 이벤트 처리할 때 자주 사용합니다. 이번에 MutableSharedFlow를 사용하며 tryEmit()이 실행되지 않는 이슈가 있었고, 이에 대한 내용을 공유해보고자 합니다. 아래에 예시 코드는 뷰모델에서 특정 이벤트를 발생시켜 액티비티에서 이벤트를 처리해주는 코드입니다. class MainViewModel @Inject constructor() : ViewModel() { private val _event = MutableSharedFlow() val event = _event.asSharedFlow() fun doSomething() { _event.tryEmit(ToastEvent("오류입니다..

    [Android] ViewModel에서 실행한 이벤트 기다리기

    ViewModel에서 이벤트를 처리하는 방법에는 여러 가지가 있습니다. (참고 : MVVM의 ViewModel에서 이벤트를 처리하는 방법 6가지) 이벤트에는 토스트 띄우기, 다이얼로그 보여주기 등 여러 가지 종류가 있는데요, 그중에는 사용자의 액션이 포함된 이벤트들도 있습니다. 이번 글에서는 ViewModel에서 실행한 이벤트를 기다리는 방법에 대해 알아보겠습니다. 예를 들어, 아래와 같은 동작을 수행하려고 합니다. 사용자가 로그아웃을 하려고 함. 로그아웃 전에 다이얼로그로 "로그아웃을 하시겠습니까?"를 보여줌. 사용자가 OK 버튼을 누르면 로그아웃 처리 후 토스트로 "로그아웃이 되었습니다."를 보여줌. 여기서의 이벤트는 '다이얼로그를 띄운다.', '토스트를 보여준다.' 2가지인데요, 이 중 다이얼로그를..

    [Android] Clean Architecture에서 Paging 라이브러리 사용하기 - 도메인 계층의 의존성 문제

    이번 글에서는 Clean Architecture에서 Paging 라이브러리를 사용할 경우 의존성을 어떤 식으로 관리해야 할지에 대해 다뤄보겠습니다. 프로젝트 구조 제가 현재 진행 중인 개인 프로젝트는 Clean Architecture + Multi module로 구성되어 있습니다. 위의 사진과 같이 Clean Architecture의 data, domain, presentation 계층에 맞게 총 3개의 모듈로 나누어져 있으며, data -> domain, presentation -> domain의 의존 관계를 가지고 있습니다. 또한 data와 presentation 모듈은 안드로이드 라이브러리로 되어 있고, domain 모듈은 안드로이드에 대한 의존성이 없는 Kotlin 라이브러리 되어 있습니다. Cl..

    [Android] MVVM 패턴과 AAC에서의 ViewModel

    안드로이드 오픈 톡방을 보다 보면 주기적으로 올라오는 질문이 몇 가지 있습니다. 그중 하나가 MVVM 패턴에서의 ViewModel과 AAC(Android Architecture Components)에서 제공하는 ViewModel이 다른 것인가에 대한 질문입니다. 앱 개발 시에 MVVM 패턴을 많이 사용하고, AAC에서 ViewModel을 제공하니 두 ViewModel이 같은 개념일 거라고 생각합니다. 결론부터 말해보자면, 두 ViewModel은 전혀 상관이 없습니다. MVVM 패턴에서 ViewModel의 역할과 AAC에서 제공하는 ViewModel의 역할은 개념적으로 차이가 있습니다. 심지어 안드로이드 공식문서에서 ViewModel을 설명할 때 MVVM 패턴에 대한 언급은 전혀 없습니다. 만약 AAC의 ..

    [Android] Gson을 이용한 Room에 다양한 타입의 데이터 저장하기

    Room은 Android Jetpack에서 제공하는 라이브러리로, SQLite에 대한 추상화 레이어를 제공하여 로컬 데이터베이스를 보다 간단하게 사용할 수 있게 해줍니다. 많은 양의 데이터를 처리하는 앱은 데이터를 로컬로 유지해서 많은 이점을 얻을 수 있습니다. 가장 대표적인 예시로는 데이터를 로컬 디비에 캐싱하는 것입니다. 앱이 네트워크에 접근할 수 없는 오프라인 상태인 경우에도 데이터가 로컬 디비에 저장되어 있다면, 이를 활용하여 콘텐츠를 탐색할 수 있습니다. Room에 데이터를 저장할 때는 기본적으로 primitive type과 그 wrapping 타입만 지원합니다. 그럼 그 외의 사용자가 정의한 커스텀 클래스나 List와 같은 경우는 어떻게 저장해야 할까요? 이번 글에서는 Room에서 다양한 타입..

    [Android] 스켈레톤 로딩 화면 구현하기 - Facebook shimmer library

    사용자가 어떠한 요청을 했는데 화면에 아무런 변화가 없다면 어떤 느낌을 받을까요? 요청이 제대로 들어갔는지, 앱이 고장 난 건지 사용자는 알 수가 없습니다. 따라서 데이터를 로딩 중에는 사용자가 알기 쉽게 로딩 애니메이션을 보여주는 것이 좋습니다. 로딩 애니메이션에는 스켈레톤 UI, 루프 애니메이션, 프로그래스 바 등의 다양한 방법이 있습니다. 이번 포스팅에서는 위의 화면과 같이 스켈레톤 로딩 화면을 구현해보겠습니다. 스켈레톤 로딩 화면은 표시될 정보의 대략적인 형태를 미리 보여줘서 다음 화면까지 부드럽게 연결해주는 역할을 합니다. 스켈레톤 로딩 화면을 구현하는 데는 여러 방법이 있지만, 가장 유명한 Facebook에서 제공하는 shimmer-android 라이브러리를 사용해보겠습니다. 라이브러리 추가 ..

    [Android] API key값 local.properties에 안전하게 보관하기

    안드로이드 프로젝트를 하며 다른 서비스의 API를 이용하는 경우가 종종 생깁니다. 위의 사진은 네이버 지도 API의 사용 가이드입니다. 이처럼 API를 호출할 때 인증을 위해 API key값을 HTTP 헤더에 포함해야 하는 경우가 많습니다. HTTP 헤더에 API key값을 담아서 요청하기 위해선 해당 key를 어딘가에서 보관하고 있어야 합니다. API key는 인증에 필요한 비밀번호나 마찬가지이므로 보안에 유의하셔야 합니다. 만약 코드상에 상수값으로 하드 코딩이 되어 있다면, Github 등에 노출될 위험이 있기 때문에 .gitignore 파일을 통해 정보가 노출되지 않도록 보관해야 합니다. 이번 글에서는 local.properties 파일을 사용해 API key값을 안전하게 보관하는 방법에 대해 알아..

    [Android] BottomNavigationView에서 Fragment 전환

    이번 포스팅에서는 BottomNavigationView를 통해 Fragment를 전환할 때 생길 수 있는 문제점과 해결 방안에 대해 알아보겠습니다. menu_bottom_navigation.xml 우선 간단하게 menu.xml을 통해 BottomNavigationView의 item을 지정해줍니다. activity_sample.xml 다음은 Fragment를 담아줄 FrameLayout과 BottomNavigationView를 배치해줍니다. SampleActivity.kt class SampleOneActivity : AppCompatActivity() { private val binding by lazy { ActivitySampleOneBinding.inflate(layoutInflater) } ove..

728x90