
1) 담을 수 있는 데이터가 적다.(50k 미만의 데이터 저장 권장)
2) 담을 수 있는 데이터 형태에 제한이 있다.
3) onCreate에서 불러와서 그려야하므로 화면 출력 시간이 걸린다

1) 액티비티나 프래그먼트보다 생명주기가 길다
2) 데이터와 UI컨트롤러를 분리하여 관리할 수 있다.
3) 프래그먼트 간 데이터 공유가 쉬워진다.

(출처 : https://charlezz.com/?p=44167)
ViewModel을 인스턴스를 얻을 때 ViewModelProvider의 첫번째 생성자 매개변수인 ViewModelStoreOwner를 Fragment들이 속해있는 부모 Activity로 지정하자. 그러면 각 프레그먼트는 동일한 ViewModel 인스턴스를 얻게 된다. ViewModel의 생명주기는 Activity를 따르게 되고, Fragment의 생명주기는 Activity의 서브셋이므로 Fragment의 생명주기 동안에 자유롭게 데이터를 공유할 수 있게 된다.
ViewModelStoreOwner를 같은 것으로 하면 같은 데이터를 공유할 수 있다는 것class TodoViewModel:ViewModel() {
val todoList: LiveData<MutableList<Todo>>
private val todoRepository:TodoRepository = TodoRepository.get()
init {
todoList = todoRepository.list()
}
fun getOne(id : Long) = todoRepository.getTodo(id)
fun insert(dto: Todo) = viewModelScope.launch(Dispatchers.IO){
todoRepository.insert(dto)
}
fun update(dto:Todo) = viewModelScope.launch(Dispatchers.IO){
todoRepository.update(dto)
}
fun delete(dto:Todo)=viewModelScope.launch(Dispatchers.IO){
todoRepository.delete(dto)
}
}
ViewModelProvider로 뷰모델 객체 생성LivaData를 위해 사용// 뷰모델
todoViewModel = ViewModelProvider(this)[TodoViewModel::class.java]
todoViewModel.todoList.observe(this){
todoAdapter.update(it)
}
todoViewModel.update() 등으로 사용하면 된다. // 어답터 연결
todoAdapter.setItemCheckBoxClickListener(object :TodoAdapter.ItemCheckBoxClickListener{
override fun onClick(view: View, position:Int, itemId:Long){
CoroutineScope(Dispatchers.IO).launch {
val todo = todoViewModel.getOne(itemId)
todo.isChecked = !todo.isChecked
todoViewModel.update(todo)
}
}
})
더 공부할 것들