글

[Android] DataBinding의 동작방식 - 1. Setter Method와의 연결

아직 광범위하게 쓰이고 있는 것은 아니지만, 2015년도에 구글이 발표한 DataBinding이라는 개념이 있다. 이 DataBinding의 기본 사용법은 Developer Page에 워낙 자세하게 (심지어 한글) 정리되어있기 때문에, 굳이 별도로 사용법을 정리할 필요는 없다. 다만, Developer Page에 나와있지 않은 내용들도 꽤 있기 때문에 그에 관해서 몇화에 나눠서 정리해보려고 한다. (아래 내용들은 Developer Page의 내용들을 어느정도 숙지 되었다는 전제로 진행됩니다.) Developer Page Link : https://developer.android.com/topic/libraries/data-binding/index.html "[Android] DataBinding의 동작방식" 전체목록     1. Setter Method와의 연결     2. BindingAdapter의 기본 및 사용 시점     3. BindingAdapter의 사용시 팁     4. include Tag 혹은 ViewStub 사용시의 Binding     5. Listener, Callback     6. InverseBinding (InverseBindingAdapter) + Two way Binding DataBinding의 기본 : 어느정도 경력이 있는 개발자들은 조금 쓰다보면 알 수 있지만, DataBinding에서 중요한 것은, BuildTime에 Binding 코드가 생성된다는 것이다. 여기서 Binding Code라는 것은, "View와 Model을 연결해주는 작업을 대신 해주는 코드" 정도로 이해하면 된다.  예를들어 activity_test.xml이라는 layout파일에 대응되는 Binding Code는 ActivityTestBinding.java라는 파일로 나타난다. 그리고 이 Class F...

[Android] EventBus보다 빠르고 간단한 MessageBus !!

Android에서 이벤트를 전달하는 방법은 다양합니다. 일반적인 Callback이나 Listener를 통해 전달하는 방법이 있고, Broadcast를 통해서 전달하거나 Intent를 통해 전달을 하는 등, 다양한 방법들이 있습니다. 하지만, 앱이 복잡해짐에 따라 Listener를 깊숙하게 전달해야하는 문제들이 있었습니다. Broadcast를 하기에는 너무 무거운 감이 있고, 기타 방법들도 마땅치 않은 경우들이 많습니다. 이러한 문제를 해결하기 위해서 다양한 개발자들이 여러 해법들을 제시해왔고, 그 중 인기를 얻고 있는 EventBus(https://github.com/greenrobot/EventBus) 가 있습니다. 저 역시 EventBus를 사용하기 위해 검토를 해봤는데, 제가 봤을 때 문제점과 우려되는 점 들이 있었습니다. EventBus의 문제 + 우려 1. 전달하는 Event의 형태는 항상 Object이다.   - instanceof 로 같은 Class를 등록해둔 Subscriber는 모두 받게 된다.   - 가볍게 이벤트의 발생만 알리고 싶어도 커스텀 클래스를 정의해야한다. 2. 정의된 Annotation을 통해 Subscriber로 등록하지만, Runtime에 Annotation이 리플렉션으로 처리되기 때문에, 약간의 속도저하를 예상할 수 있다.   - 한두개 정도의 Subscriber의 등록은 큰 문제 없겠지만, 동시에 Subscriber로 등록하는 컴포넌트들이 많다면(40~60개 수준?), 약간은 걱정되는 부분이다. 이 두가지 문제를 해결하기 위해 MessageBus 를 만들게 되었습니다. ( Github :  https://github.com/UnsignedUSB/MessageBus ) 1. MessageBus에서는 Event를 integer형으로 던질 수 있습니다. 2. MessageBus는 Annotation Processor로 돌아가기 때문에, Build tim...

[Android] Layout별 성능 비교[Measure 호출횟수 비교] (LinearLayout vs RelativeLayout vs ConstraintLayout)

이미지
 UI 구성시 가장 기본이 되는 것은 Layout이다. 이 Layout들 중, 가장 많이 쓰게 되는 것이, LinearLayout과 RelativeLayout이 아닐까 한다. 최근들어 ConstraintLayout에 대해 검토를 하는 사람들이 늘어나게 되었고, Google에서도 성능상의 이점들을 이야기하며, ConstraintLayout의 사용을 권장하고 있다.   그렇다면, 정말로 ConstraintLayout이 다른 Layout들에 비해 얼마나 좋은지 확인해보려고 한다. 그 비교의 첫번째로, Measure 호출 횟수를 비교해보려고 한다.    물론 UI성능을 확인하는데는 Measure뿐 아니라, 기타 다른 UI들이    본격 비교를 하기에 앞서서, 기존에 사용하고 있던 Layout들이 어떤 패턴으로 measure동작을 수행하는지 알아보려고 한다.  기본적으로 Measure는 자기 자신의 Measure를 수행할 때 필요한 모든 정보가 충족되지 않으면, 필요한 정보를 모두 얻을 수 있을때까지,  Child들의 Measure를 다시 타게 된다.  ※ 기본 Layout들의 Measure 호출 패턴   1. LinearLayout    Test 1. LinearLayout 1단 구성         간단한 예제로, Layout내부에 두개의 TextView를 포함한 구조를 만들었다.    위와 같은 XML구성일 때, Measure() 호출 스택은 아래와 같다.         1) LinearLayout.onMeasure()     2) TextView1.onMeasure()     3) TextView2.onMeasure()   ----------------------------------...

[Android] Retrofit2, OkHttpClient Method 정리

이미지
(이 Post는 Retrofit 2.2.0 기준으로 작성되었음) Retrofit을 적용하면서, 지원되는 기능들을 한번 정리를 해 둬야, 어떤 것을 쓸수 있는지 확실히 할 수 있을 것 같아서, 아래와 같이 정리한다. 1. Retrofit.Builder    baseUrl(String baseUrl) 을 제외하면, 대부분 DI의 형태를 띄고 있다. 각각 Injection 되는 Class들의 용도는 각 항목에서 설명한다. 분석을 하고 보니, Retrofit Class는 이 Builder를 통해 Injection 된 Instance들을 들고있는 Holder 역할을 하는 것으로 보인다. baseUrl(String baseUrl) : Base가 되는 URL을 설정한다. 많은 서비스들에서 사용하는 API들은 앞부분의 Host 정도는 동일하고, 뒷부분의 API Name들로 구분을 하는 경우가 많다. 그때 고정이 되는 앞부분을 여기서는 BaseURL이라고 이야기하고 있다. 만약 BaseUrl을 "https://apis.github.com"이라고 설정한 다음 실제 Retrofit Service Interface에서 @GET("/user/repos")라고 선언해서 사용한다면 실제 요청은 "https://apis.github.com/user/repos"로 나가게 된다. 중요한 부분이 있어서 Retrofit의 Document에서 일부를 가져온다. 올바른 사용: Base URL: http://example.com/api/ Endpoint: foo/bar/ Result: http://example.com/api/foo/bar/ 잘못된 사용: Base URL: http://example.com/api Endpoint: foo/bar/ Result: http://example.com/foo/bar/ 만약 Base URL을 설정하지 않으면 IllegalStateException이 발생하게 된다. baseUrl(HttpU...