코딩/안드로이드 (20) 썸네일형 리스트형 Android Kotlin MVVM패턴으로 간단한 검색 앱 만들기 - 5. SingleLiveEvent, SnackbarMessage S4장에서 계속 사용하던 LiveData의 문제점이 뭘까요? 예를들어 LiveData의 Observing을 이용해서 startActivity()를 한다고 생각해봅시다. 우리는 그럼 뷰모델에선 startActivityLiveData.value = SOME_DATA 와 같이 setValue를 하고, 액티비티에선 viewModel.startActivityLiveData.observe(this, Observe{startActivity(어쩌구 저쩌구 클래스::class.java)}) 와 같이 실행을 하겠죠. 그렇다면 여기서 문제점이 생깁니다. 만약 startActivityLiveData를 observe하고 있는 액티비티가 회전을 하게되면? 그럼 액티비티는 startActivityLiveData가 이전에 가지고 있.. Android Kotlin MVVM패턴으로 간단한 검색 앱 만들기 - 4. Livedata를 통한 데이터 바인딩 이번에는 저번 글에 이어서 Livedata를 이용하여 View 와 ViewModel간의 데이터 바인딩에 대해 글을 써보겠습니다. 저번 글에서도 설명한것처럼, View는 ViewModel 객체를 멤버로 가지고 있지만, ViewModel은 View의 객체를 가지고 있지 않습니다. 그럼, ViewModel에서 View의 함수를 호출하거나 View의 내용을 변경하거나, 혹은 Context나 Activity 객체의 함수를 호출해야 할 때는 어떻게 해야 할까요? 물론 Context를 이용하고 싶으면 AndroidViewModel을 상속하면 되지만, 지금은 넘어가도록 합시다. 해답은 바로 View가 ViewModel의 특정한 데이터를 Observing하고 있다가, 그 데이터가 변경될 때 View의 로직을 수행하면 됩.. Android Kotlin MVVM패턴으로 간단한 검색 앱 만들기 - 3. RxJava + Retrofit를 통한 네트워킹 및 옵저빙 이번 글에서는 Retrofit으로 네트워크 통신을 하고 그 결과값을 RxJava로 받아오는 과정을 수행해보겠습니다. 일단 Retrofit에 대해 간단히 알아보도록 하죠. Retrofit 저도 최근에 알았는데, 레트로핏 한글 문서가 있더라구요. http://devflow.github.io/retrofit-kr/ 길지 않으니 한번 정독하셔도 됩니다. 간단하게 레트로핏을 요약하자면 public interface GitHubService { @GET("/users/{user}/repos") Call listRepos(@Path("user") String user);} 이렇게 인터페이스 형태의 서비스를 먼저 만듭니다. 자바 어노테이션으로 @Get이나 @Post 등을 적어주고, 파라미터로 라우팅 정보를 적어줍니다... Android Kotlin MVVM패턴으로 간단한 검색 앱 만들기 - 2. Koin을 통한 의존성 주입 의존성 주입.. Dependency injection ... 줄여서... DI.... 이걸 왜하느냐! 라고 물으시면.. 아주 간단하게, 테스팅을 위해서! 라고 답할 수 있지 않을까요..? 지금과 같은 MVVM패턴에서 뷰모델을 테스팅한다고 칩시다. 그럼 뷰모델을 테스팅하려면 뷰모델이 의존하고 있는 모델은.. 어떻게 만들어서 뷰모델에게 줘야 뷰모델을 테스팅 할 수 있을까요? 간단한 방법으로는 모델을 내부에서 생성하지 않고 생성자의 인자로 주는 것입니다. ViewModel{val model = Model()} 과 같이 하지 않고 ViewModel(val model){} 이렇게 그러면 뷰모델을 테스팅모듈에서 생성할 때 테스팅용 모델을 뷰모델의 생성자로 '주입' 해줌으로서 뷰모델을 테스팅하기 쉽게 할 수 있는 것.. Android Kotlin MVVM패턴으로 간단한 검색 앱 만들기 - 1. BaseView, BaseViewModel을 작성하여 MVVM의 토대 만들기 MVVM 패턴과 Kotlin으로 간단한 앱을 만드는 것에 대해 글을 써보려고 합니다. 저도 정리를 좀 하고, 다른 분들도 도움이 좀 되셨으면 하는 의미에서.. 일단 어떤 앱을 만들고자 하냐면, 간단하게 카카오 Api로 이미지 검색을 해서 그 내용을 화면에 리사이클러뷰로 그리드하게 쭉 뿌려주는 앱을 샘플로 만들어 볼 예정입니다. 이렇게요! 그 과정에서 MVVM패턴을 위한 Livedata, 통신을 위한 Retrofit + RxJava, 이미지를 뿌려주기 위한 Picasso 의존성주입을 위한 Koin, 그리고 com.android.support를 대채하는 AndroidX 를 활용해 볼 예정입니다. AndroidX에 관해서는 https://thdev.tech/google%20io/2018/05/12/Androi.. androidx view.doOnLayout androidx의 view.doOnLayout에 대해 짧게 글을 써본다 공식 문서에는 이렇게 되어있다 레이아웃이 놓여졌을 때 주어진 액션을 수행. 뷰의 포지션을 구하고 싶을 때 (Kotlin)my_image_view.run{ doOnLayout { getLocationOnScreen(startPos) Logger.d("start dot rect : ${startPos[1]}") } }와 같이 하면 된다 onWindowFocusChanged() 를 사용하면 안드로이드 멀티뷰를 쓸 때 좀 이상해진다. 호출이 약간 늦거나 이르거나.. 저걸 쓰면 잘됨 Android studio code coverage시 Robolectric 사용할 때 ComplexColor 부분 에러 해결 안드로이드 스튜디오에서 Code Coverage측정할 때 Robolectric이랑 함께 쓰면 아래와 같은 오류가 뜰 수 있다 ---- IntelliJ IDEA coverage runner ---- sampling ...include patterns:exclude patterns:java.lang.VerifyError: Bad return typeException Details: Location: android/content/res/ResourcesImpl.$$robo$$loadComplexColorForCookie(Landroid/content/res/Resources;Landroid/util/TypedValue;ILandroid/content/res/Resources$Theme;)Landroid/con.. MVP 패턴 Model은 느낌대로 데이터들View도 느낌대로 화면에 뜨는 모든것들 Presenter는 뷰에서 데이터를 받아서 가공한뒤 모델로 데이터를 던져준다 뷰는 데이터(모델)를 얻기위해 프레젠터에 요청하고데이터(모델)는 뷰에 접근하려면 프레젠터에 먼저 가야한다 프레젠터는 뷰와 모델 둘 다의 포인터를 가지고 있지만뷰와 모델은 프레젠터만 포인터로 가지고 있다뷰는 모델을 가지고 있지 않고 모델도 뷰를 가지고 있지 않음 중요한 점은 View에서 수행하는 모든 '동작'을 프레젠터로 넘겨주는 것이다 그리고 또 중요한점은 View는 일종의 BaseView를 인터페이스로 구현하여야 한다그런 뒤에 프레젠터는 View 자체를 가지고 있는게 아니고 BaseView를 가지고 있어야 하며프레전터가 View에 접근하려면 꼭 BaseVie.. 이전 1 2 3 다음