본문 바로가기

전체 글

(19)
Android View.post에 대해서 한날 View의 크기를 동적으로 정해야하는 작업이 필요로 했다. 그래서 View의 크기를 받아오기 위해 View로 부터 measuredHeight값을 받아 왔으나 왠걸 0이 나왔다. 오늘은 View의 post에 대해서 알아보고자 한다. 우선 Android의 UI는 UI Thread라는 쓰레드에서 뷰를 그릴 수 있다. 내가 View로 부터 measuredHeight값을 받아왔으나 0이 나오는 이유는 아직 UI가 다 그려지지 않은 상태에서 값을 받아왔기 때문에 0이 나왔던 것이다. 여기서 알아야할 건 그럼 UI는 언제 다 그려지는 것인가? 이다. View의 크기는 저 lifecycle에서 onMeasure 단계를 거친 후에야 View의 사이즈가 측정이 되는데, 나는 화면이 생성되자마자 바로 measured된..
사이즈 단위와 이해 px(pixel) -> 디바이스 화면을 이루는 하나의 최소 단위, 픽셀의 수 만큼 영역을 차지 dp(Density Independent Pixel) -> 다른말로는 dip, 디스플레이의 크기를 기준으로 하여 영역을 차지(즉, 픽셀의 수가 아닌 디스플레이의 기준으로 사이즈를 측정한다.) px = (dp * 디바이스의 density) (디바이스의 density 구하기 - context의 resource로 부터 displayMetrix에게 density를 받아올 수 있다.) sp (Scale Independent Pixel) -> dp와 마찬가지이지만 sp는 텍스트의 사이즈를 측정할때 사용한다.)
LiveData & StateFlow, SharedFlow 그리고 KMM Android에서는 LiveData말고도 옵저버 패턴으로 값을 관리 하고 모델을 전달 할 수 있는 방법이 있습니다. 바로 StateFlow, SharedFlow인데요. StateFlow와 SharedFlow는 LiveData와 달리 독립적입니다. 이게 무슨 말이냐면 LiveData는 Android의 Lifecycle이라는 아래에서 값을 관리하나 StateFlow와 SharedFlow는 그렇지 않습니다. 언어 레벨에서 제공하는 것으로 보이며 kotlin의 coroutine 패키지에 존재합니다. (Android 공식문서를 보고 오시는 것을 추천 드립니다!) LiveData는 Android의 View단위의 라이프 사이클 안에서 옵저버패턴을 수행합니다. 옵저버 패턴을 수행함으로써 값의 변화를 감지하고 관찰 할 ..
Flow 이해하기 2(flow 연산자) 지난시간에는 flow가 어떻게 생겼는지, 그리고 구독자와 발행자가 어떻게 값을 주고 받는지에 대해서 알아보았습니다. 이번 포스팅에서는 Flow의 연산자가 어떤것이 있는지 각 연산자가 수행하는 것이 무엇인지에 대해서 알아보겠습니다. collect 연산자(종단 연산자) Flow 이해하기 1 에서 아주 간략하게 설명 드렸습니다만 그래고 Flow의 연산자들을 이해하고 공부해보는 시간이니 만큼 좀 더 자세하게 알아보겠습니다. collect는 emit을 통해 값을 받을 수 있는 연산자 입니다. 값을 방출 하는것이 emit 이라면, 구독자 측에서 값을 받는 연산자를 종단 연산자라고 합니다. 그리고 collect는 대표적인 종단 연산자 라고 합니다. fun flow(): Flow = flow { repeat(5) { ..
Flow 이해하기 1 Flow는 Coroutine에서 사용가능한 비동기 스트림 입니다. 스트림이란? 사전적 의미는 하나의 "흐름" 입니다. Flow를 사용하면서 가장 기초적이고 중요한 것은 발행자와 구독자라고 생각합니다. 이번 포스팅은 발행자와 구독자의 사이 그리고, 값을 보내는 방법 정도까지만 알아보겠습니다. Flow는 발행자가 구독자에게 데이터를 흘려보냅니다. Coroutine을 같이 공부한 것 처럼 Flow도 예제 하나하나 보면서 어떻게 흘려보내고 어떤 연사자를 사용하면 발행한 값이 어떻게 변형이 되는지 같이 알아보아요. 우선 첫번째로 Flow를 사용하는 방법과 발행자와 구독자가 어떻게 생겼는지 아래 코드로 알아보겠습니다. fun flow(): Flow = flow { emit(10) } fun main() = runB..
Coroutine 이해하기 5 이번엔 앞서 몇번 언급하였던 Coroutine Scope와 Coroutine Dispatcher에 대해서 알아보겠습니다. 먼저 Coroutine Scope 입니다. Coroutine이 실행되는 구조를 나열해보면 Coroutine Scope
Coroutine 이해하기 4 이번엔 Coroutine의 async에 대해서 알아보겠습니다. 지금까지 Coroutine의 예제에서는 프로그램의 순서에 따라 혹은 job을 컨트롤한 순서에 따라 실행되었습니다. 하지만 async 키워드를 사용하면 코드를 "동시에 " 수행 할 수 있습니다. 결과를 쉽게 보기위해서 어떻게 하면 좋을까 고민해봤는데, 그냥 시간으로 출력하는게 가장 한눈에 보기 쉬울 것 같습니다. 아 그리고 async는 Deferred 객체를 반환합니다. launch가 Job을 반환하는 것 처럼요. kotlin에서는 measureTimeMillis{} 키워드를 사용하면 해당 블럭내 코드가 수행한 시간을 리턴해 줍니다. 이를 활용해서 async 키워드를 쓰고 안 쓰고의 차이를 확인해 보겠습니다. suspend fun getRand..
getParcelable, Deprecated 되다. 얼마전 제 개인 프로젝트의 target SDK를 33으로 올렸더니 deprecated된 메소드를 경험하여서 이를 공유하려고 합니다. 그리고 이와 함께 데이터 직렬화와 역직렬화에 대해서도 몇가지 서술해 보곘습니다! 저는 Activity에서 WebView로 이동할때 intent에게 모델을 넘겨주었습니다. 그리고 받는쪽에서 사용한 메소드는 getPacelable(키값) 입니다. targetSDK를 올리고 혹시나 싶어 여러 클래스 들을 확인해본 결과, 역시 deprecated 된 메소드를 하나 발견 했습니다. 위 메소드의 설명은 아래와 같습니다. 위 메소드에 관한 문제 원인은 아래와 같습니다. 1. Android가 제공하는 클래스가 아닌 경우 ClassLoader로 setClassLoader를 호출 해야한다. ..