반응형
[MVVM 정복] 3. Model과 리액티브 프로그래밍(Rx)
Android, iOS 2020. 5. 18. 17:47

이번편에서도 코드를 보면서 학습하길 권한다. (나도 학습하면서 포스팅 중) Model Model은 View에 표시할 데이터를 의미한다. DataModel이라고도 하며 DB, Network, SharedPreference 등 다양한 데이터 소스로부터 필요한 데이터를 준비한다. ViewModel에서 데이터를 가져갈 수 있게 데이터를 준비하고 그에 대한 "이벤트"를 보낸다. DataModel, DataModelImpl DataModel를 interface로 만들어서 구현부(DataModelImpl)를 분리시켰다. ViewModel이 데이터를 가지고 갈 수 있도록 준비되어 있다. 데이터를 가지고 올 소스를 API로 받아야하기에 KakaoSearchService를 구현했다. API의 파라미터 중 정해진 값만 전달..

[MVVM 정복] 2. SnackbarMessage, BaseViewModel, BaseActivity
Android, iOS 2020. 5. 18. 17:46

코드는 내 깃헙을 참고하면 된다. 커밋 로그와 블로그 포스팅 제목이 유사하게 따라간다. SnackbarMessage SnackbarMessage는 SingleLiveEvent이다. 앞 포스팅에 있는 그 SingleLiveEvent이다. Snackbar에 보여주고 싶은 메세지가 있다면 이 이벤트의 value에 원하는 메시지를 담으면 된다. class SnackbarMessage : SingleLiveEvent() { fun observe(owner: LifecycleOwner, observer: (Int) -> Unit) { super.observe(owner, Observer { it?.run { observer(it) } }) } } 위의 super.observe는 SingleLiveEvent에 있는 ..

[MVVM 정복] 1. LiveData와 SingleLiveEvent
Android, iOS 2020. 5. 18. 17:44

MVVM에서 데이터가 변경되는 시점에 UI가 변경되도록 하기 위해서 LiveData를 사용한다. 그런데 LiveData의 특성상 시도때도 없이 이벤트를 발생시킬 수 있기 때문에 SingleLiveEvent라는 것을 보통 만들어 쓴다. 여기서는 이 SingleLiveEvent의 용도를 확인해보자. LiveData. Data의 변경을 관측할 수 있는 (데이터가 변경되었을 때 감지가 됨) Data Holder 클래스. (데이터를 가지고 있음) 변경을 감지할 수 있는 이유는 컴포넌트의 생명주기를 LiveData가 알고 있기 때문이다. LiveData는 Observer 패턴을 가지기 때문에 데이터의 변경이 있을 시 콜백으로 받아서 처리할 수 있다. 옵저버 등록과 관련하여 다른 블로그에서 설명한 글을 가지고 와 보..

[MVVM 정복] 0. 어떤 순서로 개발할 것인가
Android, iOS 2020. 5. 18. 17:43

MVVM을 공부하려면 알아야하는 것이 한두개가 아니다. LiveData, ViewModel, Rx 등등 무엇부터 손을 대야할지 감도 잡히지 않는다. 나 역시 그렇다. 중심이 되는 자료가 필요할테고 거기서 시작하기로 했다. https://github.com/hongbeomi/HarryPotter https://github.com/5seunghoon/Kotlin-MVVM-Sample 포스팅 순서 1. LiveData와 SingleLiveEvent 2. SnackbarMessage, BaseViewModel, BaseActivity 3. Model과 리액티브 프로그래밍(Rx) 4. 어렵고 이해도 잘 안되는 DI, 그리고 Koin 5. View에 Koin으로 의존성 주입하기 6. RecyclerView 적용해보..

launchMode도 모르고 액티비티 인스턴스를 관리했다니...
Android, iOS 2020. 4. 19. 21:26

최근에 launchMode에 대해서 알고 있느냐는 질문을 받았다. "음? launchMode? 그게 뭔가요?" "그럼 액티비티 인스턴스는 어떻게 관리했나요?" "......" 생각해보니 내가 그런걸 염두하고 개발을 안했던거 같다. 늦기 전에 지금이라도 알아보자. launchMode로 액티비티 인스턴스 관리하기. 1. launchMode의 용도 우선 공식문서에는 뭐라고 했는지 들여다 보았다. 액티비티를 시작하는 방법에 대한 지침입니다. 인텐트를 처리하기 위해 액티비티를 호출할 때 발생하는 것을 결정하기 위해 Intent 객체에서 액티비티 플래그(FLAG_ACTIVITY_* 상수)와 함께 작동하는 4개의 모드가 있습니다. 항상 느끼지만 공식 문서의 번역은 조금 이해하기 힘들다. 다른 분들의 자료를 참고삼아 ..

하다하다 이제 이미지에서도 Crash가 나타난다. 나원참.
Android, iOS 2020. 1. 15. 17:36

작업을 하다보면 감도 안잡히는 에러 메시지를 볼 때가 있다. 아래 메시지가 그런 종류. // Crashlytics Caused by org.xmlpull.v1.XmlPullParserException: Binary XML file line #11: invalid color state list tag gradient 보자마자 '이게 뭐다냐'라고 생각하며 검색을 해보니... 벡터 이미지(VectorDrawable) 내부에 gradient 문제로 확인 되었다. 안드로이드 버전 7(누가)부터 fillColor 옵션을 지원하기에 그 이전 버전의 디바이스에서 충돌할 수 있다. 아래는 구글 문서에서 안내하는 fillColor 옵션의 설명이다. android:fillColor android:fillColor Speci..

Google 버그가 먹어버린 3시간, CoordinatorLayout와 RecyclerView
Android, iOS 2020. 1. 14. 11:14

현상을 요약하자면 다음과 같다. RecyclerView로 리스트가 나타난다. 스크롤을 한다. 스크롤이 멈추자마자 개별 Holder의 버튼을 클릭한다 그런데 클릭 이벤트가 발생하지 않는다??? 조금 기다렸다가 클릭을 하면 된다. 또는 두번째 클릭을 하면 이벤트가 발생한다. 평소에 수백번도 만들어 본 리스트다. 그런데 뜬금없이 클릭이벤트가 안된다고? 난 수차례 내 코드를 살펴보고 모르는 구조가 있는지 검색을 한 다음에야 구글이 해결하지 못한 버그라는 것을 알게 되었다. 이런 현상이 나타나는 경우는 더 존재한다. 특히 AppBarLayout가 그렇다. CoordinatorLayout와 RecyclerView 혹은 AppBarLayout을 사용했을 때 원하는 형태 혹은 이벤트가 발생하지 않는 것으로 보인다. 이..

Volley에서 newRequestQueue를 Deprecated시켰다고 한다
Android, iOS 2020. 1. 6. 15:04

최근에 volley를 1.1.1로 업데이트를 했더랬다. 그러고 얼마지나지 않아 아래와 같은 이슈가 터졌다. Caused by java.lang.NullPointerException: Attempt to invoke virtual method 'com.android.volley.Request com.android.volley.Request.setRequestQueue(com.android.volley.RequestQueue)' on a null object reference 발생 지점을 확인해보니 Deprecated된 newRequestQueue를 사용하고 있었다. 그렇다면 RequestQueue가 무엇일까? document에서는 아래와 같이 설명을 하고 있다. public class RequestQueu..

큰 이미지가 계속 흐릿해보이면 Glide를 의심해보자
Android, iOS 2020. 1. 2. 16:34

맹세코 노안이 올 시기가 아닌데 디바이스의 이미지가 좀 흐릿해 보인다. 서버에서 이미지를 엉뚱한걸 보내나 싶어서 다운로드 받았는데 멀쩡하다. 그래서 이미지를 그냥 로컬에 담아서 ImageView에 set을 해봤는데 이것도 멀쩡하다. 그렇다면 의심해볼 녀석은 하나밖에 남지 않았다. "야!! 글라이드!! 너 뭐하는거야?" format이 문제가 아니다 먼저 샘플 코드를 보자. 무엇이 문제인지 찾기 위해 주석처리를 하면서 많은 옵션을 넣은 흔적이 보이는가? Glide.with(this) .load(R.drawable.bigimage3) .format(DecodeFormat.PREFER_ARGB_8888) // .diskCacheStrategy(DiskCacheStrategy.NONE) // .skipMemory..

JavaScript는 모르지만 WebView에서 사용하고 싶어!!
Android, iOS 2019. 11. 28. 15:05

마아아아아아아아아아아안약에, 만약에 웹뷰의 특정 이벤트를 네이티브에서 받아서 메시지를 보여주고 싶다면 어떻게 해야할까? 여러 방법이 있겠지만 JavaScript 함수를 호출하는 방법을 써보고자 했다. 동작이 되는 웹서비스를 만들 수 없으니 로컬에 HTML 파일을 두고 테스트할 수 있도록 샘플앱을 만들었다. (착하지?) 내 Github에서 모든 코드를 확인할 수 있다. (정말 착하지?) var handler = Handler() inner class AndroidBridge { @JavascriptInterface fun sendData(msg: String) { handler.post(Runnable { var message = msg if (message.isEmpty()) { message = "입력..

728x90
반응형