티스토리 뷰
BaseActivity
- 개발을 하다보면 모든 Activity에서 공통적으로 만들어줘야하는 변수들이 있다
- 이 변수들을 파일마다 만들어주는 번거로운 과정을 생략하기 위해서 Base 패키지에 필수적인 내용이 들어있는 파일을 만들어놓고, Activity 등에서 해당 파일을 상속하여 사용한다
BaseActivity.kt
- 추상클래스로 정의되어있다
- abstract로 정의된 변수인 layoutResID와 viewModel은 상속받은 activity에서 반드시 재정의 해줘야한다
- layoutResID는 setContentView로 호출할 Layout 파일을 말한다
- viewModel은 Activity에서 viewModel로 쓸 변수이다
abstract class BaseActivity<T : ViewDataBinding, R : BaseViewModel> : AppCompatActivity() {
lateinit var viewDataBinding: T
abstract val layoutResID: Int
abstract val viewModel: R
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 초기화된 layoutResId로 databinding 객체 생성
viewDataBinding = DataBindingUtil.setContentView(this, layoutResID)
// live data를 사용하기 위해 해줘야함
viewDataBinding.lifecycleOwner = this@BaseActivity
}
}
MainActivity.kt
- BaseActivity를 상속받아 구현한다
- layoutResID 객체를 정의하면 BaseActivity에서 만들어지는 viewDataBinding 객체를 바로 사용할 수 있다
class MainActivity : BaseActivity<ActivityMainBinding, MainViewModel>() {
// databinding객체(viewDataBinding)와 viewModel객체(viewModel) 생성
override val layoutResID: Int = R.layout.activity_main // 레이아웃 연결
override val viewModel: MainViewModel = MainViewModel by viewModel() // 의존성 주입
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
}
BaseViewModel
- BaseActivity와 마찬가지로 ViewModel에서 기본적으로 필요한 변수와 함수를 정의한 파일이다
BaseViewModel.kt
- 상속이 가능한 클래스로 만들어주기 위해 open 키워드를 사용했다
- addDisposable()은 RxJava로 Obsevable을 Observing 할 때 사용할 함수이다
- onCleared()는 Observing을 그만두게 될 때(뷰가 사라질 때) 메모리 누수를 방지하기 위해 compositeDisposable을 비우는 함수이다
open class BaseViewModel : ViewModel(){
private val compositeDisposable = CompositeDisposable()
fun addDisposable(disposable: Disposable) {
compositeDisposable.add(disposable)
}
override fun onCleared() {
compositeDisposable.clear()
super.onCleared()
}
}
MainViewModel.kt
- BaseViewModel을 상속받았기 때문에 MainViewModel 클래스에서도 BaseViewModel에 있는 함수들을 사용할 수 있다
- data를 가져오는 함수에서 addDisposable() 함수로 repository의 통신함수를 사용해 구현하면 된다
class MainViewModel : BaseViewModel(){
fun getData(){
addDisposable()
}
init {
//초기화 블럭
}
}
🕊참고자료
시연이의 머리🤓
'Android' 카테고리의 다른 글
[kotlin] DI 의존성 주입 - koin 사용하기 (0) | 2020.06.14 |
---|---|
[Android & kotlin] AAC(Android Architecture Components) - ViewModel (0) | 2020.06.04 |
[디자인패턴] MVVM패턴 (DataBinding) (0) | 2020.03.30 |
[kotlin] 안드버디 스터디 정리 -2 (0) | 2020.03.22 |
[디자인패턴] MVVM 패턴 (MVVM의 구조와 동작, Repository pattern) (0) | 2020.03.22 |