최근 안드로이드 스튜디오를 업데이트한 뒤 아래와 같은 메시지와 함께 빌드가 되지 않는 상황을 맞이 했다. Could not initialize class org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetKt 업데이트 정보는 다음과 같다. // build.gradle classpath 'com.android.tools.build:gradle:4.0.0' // gradle-wrapper.properties distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip 이는 Gradle 버전에서 지원하는 코틀린 버전이 맞지 않아서 생기는 문제이다. 아래와 같이 코..
* 샘플코드는 제 깃헙에 있습니다. Java에서 Try는 예외처리 구문이다. 흔히 얘기하는 Try-catch문이라고 한다. 그런데 이 구문도 완벽하지는 않다. 아래 예시를 보자. public class TryWithResource { public static void main(String[] args) { FileInputStream stream = null; try { stream = new FileInputStream(""); } catch (IOException e) { e.printStackTrace(); } finally { try { stream.close(); } catch (IOException e) { e.printStackTrace(); } } } } 프로그램이 끝날 때, 닫혀야 하는(..
완성한 코드는 다음과 같다. (내가 드디어 해냈다. 캄.동.) https://github.com/conquerex/mvvm-template conquerex/mvvm-template MVVM 학습과 앞으로 활용을 위한 템플릿. Contribute to conquerex/mvvm-template development by creating an account on GitHub. github.com 앞으로 개발을 한다면 다음과 같은 시나리오일 것이다. (일종의 복습) class MainActivity : BaseActivity() { // 생략 override val viewModel: MainViewModel by viewModel() // 생략 override fun initDataBinding() { v..
이번편에서도 코드를 보면서 학습하길 권한다. conquerex/mvvm-template MVVM 학습과 앞으로 활용을 위한 템플릿. Contribute to conquerex/mvvm-template development by creating an account on GitHub. github.com 이번편까지 하면 코드는 다 입력한 것이다. 물론 MVVM을 정복한 것은 아니니 계속 긴장하고 있자. (나 스스로 한테 한 얘기) 먼저 MainSearchRecyclerViewAdapter를 만들자. 코드는 역시 내 Github에 있다. 블로그 포스팅 번호와 커밋 메시지의 번호가 동일하니 참고해서 학습하면 된다. 어댑터 만들면서 item_main_image, ic_image_black_24dp, item_ma..
이번편에서도 코드를 보면서 학습하길 권한다. conquerex/mvvm-template MVVM 학습과 앞으로 활용을 위한 템플릿. Contribute to conquerex/mvvm-template development by creating an account on GitHub. github.com 우선 MainActivity를 준비하자. 물론 activity_main.xml도 같이 세팅하자. 여기서 DataBinding이 나온다. 하지만 생각보다 단순한 개념이기에 참고 링크만 남겨둔다. MVVM에 데이터바인딩이 필수라고 하는 분이 있고 그렇지 않다고 얘기하는 분도 있었다. 필수라고 하는 분은 의존성이 낮아짐을 근거로 삼고, 필수가 아니라는 분은 디자인패턴적으로 봤을 때 없어도 되기 때문이라고 한다. ..
이번편에서도 코드를 보면서 학습하길 권한다. conquerex/mvvm-template MVVM 학습과 앞으로 활용을 위한 템플릿. Contribute to conquerex/mvvm-template development by creating an account on GitHub. github.com DI(Dependency injection)가 "의존성 주입"이라는 의미인 것은 많은 분들이 알고 있다. 그런데 의존성 주입이 무엇이냐고 물어보면 제대로 답할 수 있는 사람이 얼마나 될까? 그래서 알아보았다. DI, 넌 누구냐. 일단 의존성이 무엇인지 알아보자. 두 모듈의 연결, 두 클래스의 관계 의존성이 크다 == 결합도가 높다 '의존성이 큰게 왜??'라는 생각이 들 수 있다. 의존성이 크게 되면 독립성은..
이번편에서도 코드를 보면서 학습하길 권한다. (나도 학습하면서 포스팅 중) Model Model은 View에 표시할 데이터를 의미한다. DataModel이라고도 하며 DB, Network, SharedPreference 등 다양한 데이터 소스로부터 필요한 데이터를 준비한다. ViewModel에서 데이터를 가져갈 수 있게 데이터를 준비하고 그에 대한 "이벤트"를 보낸다. DataModel, DataModelImpl DataModel를 interface로 만들어서 구현부(DataModelImpl)를 분리시켰다. ViewModel이 데이터를 가지고 갈 수 있도록 준비되어 있다. 데이터를 가지고 올 소스를 API로 받아야하기에 KakaoSearchService를 구현했다. API의 파라미터 중 정해진 값만 전달..
코드는 내 깃헙을 참고하면 된다. 커밋 로그와 블로그 포스팅 제목이 유사하게 따라간다. 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에서 데이터가 변경되는 시점에 UI가 변경되도록 하기 위해서 LiveData를 사용한다. 그런데 LiveData의 특성상 시도때도 없이 이벤트를 발생시킬 수 있기 때문에 SingleLiveEvent라는 것을 보통 만들어 쓴다. 여기서는 이 SingleLiveEvent의 용도를 확인해보자. LiveData. Data의 변경을 관측할 수 있는 (데이터가 변경되었을 때 감지가 됨) Data Holder 클래스. (데이터를 가지고 있음) 변경을 감지할 수 있는 이유는 컴포넌트의 생명주기를 LiveData가 알고 있기 때문이다. LiveData는 Observer 패턴을 가지기 때문에 데이터의 변경이 있을 시 콜백으로 받아서 처리할 수 있다. 옵저버 등록과 관련하여 다른 블로그에서 설명한 글을 가지고 와 보..
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 적용해보..
Comment