일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- lifecycle
- activity
- 안드로이드
- CustomView
- kotlin
- Behavior
- Coroutine
- View
- 알고리즘
- 알림
- CollapsingToolbarLayout
- sqlite
- room
- 코틀린
- Algorithm
- Android
- LiveData
- ViewModel
- notification
- DataBinding
- hilt
- 백준
- AppBarLayout
- BOJ
- onLayout
- recyclerview
- HTTP
- Navigation
- onMeasure
- CoordinatorLayout
- Today
- Total
목록ViewModel (7)
개발일지
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/uW1Uk/btrgU2IsBkw/y7QcQ3b2aI0LUgvDHC2kJ1/img.png)
MVVM Model View ViewModel로 이루어진 디자인 패턴이다. MVP 패턴에서 View와 Presenter가 1대1 관계, View가 Presenter에게 의존적인 단점을 보완한 디자인 패턴이다. View에서 사용자의 입력을 받으면 Command Pattern을 통해 ViewModel에 Action을 전달합니다. ViewModel은 해당 Action에 맞게 Model을 업데이트하고 ViewModel은 Model의 업데이트를 수신하여 값을 수정합니다. View도 마찬가지로 ViewModel의 변화를 감지하여 새로운 값을 바인딩합니다. View MVC 패턴에서 View처럼 사용자에게 UI를 제공한다. View는 ViewModel을 알지만 ViewModel은 View를 모릅니다. 또한 DataBi..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/MH3IE/btq21N6ErKU/kqWIYxRaGKlduYbjXuI9hK/img.png)
양방향 데이터 바인딩 EditText에서 android:text="@{string}" 이런식으로 바인딩 하는 것을 단방향 바인딩이라고 한다. (Data를 EditText에 일방적으로 바인딩하는 개념) 양방향 데이터 바인딩은 EditText, RadioButton, DataPicker등 데이터가 변하는 View가 역으로 Data로 바인딩하는 것이다. * 기본으로 지원하는 Two-Way-Databinding LifeCycleOwner 설정하기 binding.lifecycleOwner = lifecycleOwner ViewModel 만들기 원래 양방향 데이터 바인딩은 ObservableField를 통해 타입을 정해서 가능했지만 LiveData도 지원하기 시작했다. 이번 예제에서는 LiveData를 통해 양방향..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/y0ZSV/btq0Q7SWs9A/lET0sSndiK5RTSIwpXXw7K/img.png)
ViewModelScope ViewModel마다 존재하는 Scope이다. ViewModel이 삭제되면 자동으로 취소된다. class ExampleViewModel : ViewModel() { init { viewModelScope.launch { /* ViewModel이 사라지면 종료된다. */ } } } LifeCycleScope LifeCycle 객체마다 존재하는 Scope이다. Create, Start, Resume 3가지의 Mode를 지원하고 Active상태(화면에 보이는 상태)일 때만 수행된다. class CoroutineFragment : BaseFragment(R.layout.fragment_coroutine) { private var count = 0 private val logList b..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/wTzK3/btq0AHTKTkl/fcCjlacUQPRoDtQdxG1TZ0/img.png)
ViewModel with SavedStateHandle ViewModel은 UI Data를 안전하게 보관하는 방법의 하나입니다. onSavedInstaceState()를 사용하지 않고 데이터를 쉽게 저장/복원 할 수 있고 메모리에 저장하기 때문에 SavedStateHandle에 비해 빠릅니다. 하지만 메모리에 저장하기 때문에 Android Framework에서 메모리를 회수하면 저장된 값을 잃습니다. 하지만 SavedStateHandle은 디스크에 직렬화하여 저장하기 때문에 값을 유지할 수 있습니다. => ViewModel에서는 이러한 문제점을 해결하기 위해 SavedStateHandle을 쉽게 조작할 수 있도록 도와줍니다. ViewModel SavedInstanceState Persistent Sto..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/p3o1M/btqVSt1HcQG/JVo30DncULw7bpEyPA2GYK/img.png)
LiveData LiveData는 Data를 Observer 패턴으로 관찰하여 변화가 있을 때 업데이트하는 코드를 작성할 수 있다. 일반적인 Observer패턴과 다르게 LiveData는 Activity나 Fragment의 생명주기를 관찰하여 활동 상태(STARTED, RESUMED)일 때만 업데이트한다. dependency dependencies { def lifecycle_version = "2.2.0" // LiveData implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version" } 장점 UI와 데이터 상태의 일치 보장 Observer패턴을 따르기 때문에 Observer코드에 UI를 변경하는 코드를 삽입하면 데이터와 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/YMpFM/btqVqGFRGTU/QfsVCYCkZyy0pA8FUorgE1/img.png)
ViewModelProvider ViewModel을 사용할 때 ViewModel을 직접 생성하는 것이 아닌 ViewModelProvider를 통해서 ViewModel를 요청하게 된다. ViewModel을 직접 생성자를 통해 생성하면 ViewModel을 잘못하용 하는 것이다. ViewModel 생성과정 ViewModelProvider를 통해 ViewModel을 요청한다. ViewModelProvider생성자로 ViewModelStoreOwner(Activity, Fragment), ViewModelProvider.Factory를 넘겨받는다. ViewModelProvider는 ViewModelStoreOwner를 참조하여 ViewModelStore에 ViewModel을 요청한다. ViewModelStore에..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/vcwmt/btqVswXc91R/EnxsYqkZHWa4K1k0NtOCk1/img.png)
ViewModel Android Jetpack의 구성요소이며 UI관련 데이터를 관리하도록 설계되었습니다. UI관련 Data를 Activity, Fragment와 분리시켜 관리하면서 많은 이점을 얻을 수 있습니다. 장점 Android에서 Activity와 Fragment의 수명주기를 관리하기 때문에 Android에서 UI 컨트롤러를 제거하거나 다시 만드는 경우 데이터가 삭제되지만 ViewModel은 독립된 수명주기를 가지기 떼문에 데이터를 유지할 수 있습니다. UI관련 Data를 비동기적인 호출로 받아올 때 메모리 누수를 신경쓰거나, 비동기 호출을 관리하는 코드가 필요하거나 UI 컨트롤러가 변경될 경우 이미 호출한 코드를 다시 호출해야하는 경우가 생길 수 있지만 ViewModel을 재사용하면서 이러한 불편..