본문 바로가기

분류 전체보기

(32)
Cannot access database on the main thread since it may potentially lock the UI for a long period of time. 안드로이드에서 roomDB를 쓰는데 아래 에러를 만났다. Cannot access database on the main thread since it may potentially lock the UI for a long period of time. 우선 위의 에러를 해결한 방법을 설명하기 앞서서 하나 알아둬야 할게있다.안드로이드에선 외부통신(핸드폰 내부에 저장한 데이터 RoomDB나 SQLlite, Retrofit을 통해서 외부 api 통신에서도)을 메인 스레드에서 동작시키면 안된다.자 그렇다고 치더라도...뭔가 이상하다. 코루틴을 사용해서 veiwModelScope 에서 메소드를 실행하면 자동적으로 메인스레드가 아니라 워커 스레드에서 동작하는 것으로 알고 있는데 메인스레드에서 코드가 동작하고 있다는 말일..
안드로이드 RoomDB 예외 처리하는 방법 게시글을 통해서 배울 수 있는 것들외부통신시 sealed class 를 활용해서 각 상황 대응하기외부통신에서 예상치 못한 에러가 발생했을때 해결하는 다양한 방법들 게시글을 이해하기 위해서 필요한 지식들 코루틴에 대한 기본적인 개념 코틀린 안드로이드 RoomDB 기존에 RoomDB에 저장했던 데이터를 불러오는데 예상치 못하게 null을 받아오는 상황이 일어났습니다.이번 문제를 겪으면서 생각했던 해결책과 대체로 다른 사람들은 어떤 식으로 처리하는지 알게되서 이를 서술해보도록 하겠습니다.그리고 게시글의 본격적인 내용을 서술하기 앞서서 RoomDB에서 데이터를 받아오는 경우 뿐만이 아니라 외부 서버와 통신을 할때도 예상치 못한 데이터를 받아왔을때 예외를 처리하는 것은 매우 중요합니다. 안드로이드 개발자라면 외부..
suspendCancellableCoroutine 이란 suspendCancellableCoroutine게시글을 이해하기 위해서 필요한 지식들1. 코루틴에 대한 기본적인 개념2. 코틀린3. 안드로이드4. Firebase Firestore5. Firebase Storage  CancellationException 을 제공해주는 코루틴이다. 외부와 통신을 했을때 콜백의 작업이 다 끝나고 났을때 해당 결과값을 사용하고 싶을때 쓰는 기술이다.  안드로이드에선 통신에 대한 결과 처리를 콜백에서 처리하게끔 구현하는 기술들이 많다. 이번 게시글에서 소개할 코드에서 쓰는 Firestore도 그렇고 Retrofit또한 그러하다. 콜백에서 요청에 대한 응답값을 받아왔오면 우리는 해당 응답값을 바탕으로 다음 작업을 진행하기를 원한다. 하지만 오늘 소개할 susepndCancel..
android.os.BadParcelableException: Parcelable encountered IOException writing serializable object (name = model.Images) 아주 오래전에도 한번 만났던 오류인 것 같은데.. 에러가 발생했던 이유는... Serialize 할 수 없는 객체인 Uri를 DataClass 에서 사용하려고 했었기 때문이다. 아래 코드는 내가 작성한 Model 클래스다. import android.net.Uri import java.io.Serializable data class Images(val uri : Uri) : Serializable 이미지 하나만 보여주는 리사이클러뷰를 표현하기 위해서 위와 같이 개발했다. 갤러리에서 사진을 여러장 선택하면 사진 uri값이 list에 담기고, 인텐트를 사용해서 다음 화면(액티비티)로 넘겨주려고 했다. 해당 코드는 아래와 같다. ChooseMediaActivity.kt ... // onCreate 안이다. b..
java.lang.IllegalStateException: Flow invariant is violated:Emission from another coroutine is detected. 에러 내용 java.lang.IllegalStateException: Flow invariant is violated:Emission from another coroutine is detected. Child of StandaloneCoroutine{Active}@b93bc05, expected child of StandaloneCoroutine{Completed}@20ec45a. FlowCollector is not thread-safe and concurrent emissions are prohibited. To mitigate this restriction please use 'channelFlow' builder instead of 'flow' 아마 글자가 작아서 잘 안보이실분들을 위해서 사진으로..
FireBaseStorageCleanArchitecutre 예제 FireBase에서 storage에 이미지를 등록하는 절차를 클린아키텍쳐적용한 예제입니다. 이 예제를 통해서 공부할 수 있는 기술들 1. AndroidCleanArchitecture 2.FireBase Storage 3.Hilt 4.typealias(쉬운 개념이니 따로 구글링하시는 것도 좋습니다!) 예제만 보시고 싶으신 분들은 아래 링크를 참조하시면 되고요. https://github.com/YunSeokVV/FireBaseStorageCleanArchitecutrePractice 주의 google-service.json 파일을 반드시 따로 추가해주셔야 합니다!! 각자 Firebase Console 로 가셔서 프로젝트를 생성하고 나면 확인이 가능해요! 주인장이 나름 중요하다고 생각한 부분의 내용을 보고싶..
Flow (안드로이드) Flow란? -kotlin에서 제공해주는 비동기 통신을 도와주는 기능이다. 안드로이드에서 자주 사용되고 보통 반응형 UI를 만드는데 자주 사용된다. 보통 서버에서 데이터를 받아오거나 로컬DB에서 데이터를 받아올때 많이 사용된다. Flow는 코루틴 위에서 동작하기 때문에 본인이 코루틴에 관해서 잘 모른다면 먼저 코루틴에 관해서 선행학습을 해야할 필요가 있다. Flow의 구성요소 Flow에는 세가지 구성요소가 있다. Producer : 번역하면 생산자인데, 보통 repository를 일컫는다. repository에는 서버나 로컬에서 받아온 데이터를 갖는 저장소를 의미한다. Flow가 코루틴 위에서 동작하기 덕분에 데이터를 비동기적으로 받아올 수 있다. Intermediary : 번역하면 중재자이다. 이 녀석..
Hilt를 이용한 ViewModel 객체 생성 Hilt를 사용해서 VIewModel 객체를 뷰(Activity)에서 생성한뒤 사용하는 방법에 관해서 알아보겠습니다. 글의 뒷부분에서 Hilt를 사용하지 않고 viewModel 객체를 생성해서 사용하는 방법도 서술하겠습니다. 우서 이 글의 주제가 Hilt를 이용한 ViewModel 객체의 생성이니 관련 내용을 서술하도록 하겠습니다. ps. 현재 혼자서 공부하고 있는 프로젝트에서 코드를 사용하고 있어서 주제와 조금 관련이 없는 코드들도 섞여 있을 수 있겠네요. Hilt를 이용한 ViewModel 객체 생성하는 방법 우선 Hilt를 사용하기 위해서는 Application에서 @HiltAndroidApp 어노테이션을 사용해줘야 합니다. -Hilt를 사용하는 모든 앱은 @HiltAndroidApp으로 주석이 지..