ViewModel ?
-MVVM 패턴에서 수명주기를 고려하여 데이터를 저장하고 관리한다.
-ViewModel 객체는 다른 activity나 fragment에서도 사용할 수 있다.
위 그림은 뷰 모델의 생명주기이다.
위의 그림과 같이 액티비티가 시작되고, 종료될 때 까지 뷰모델은 유지된다.
안에서 프래그먼트가 생성되고, 다른 프래그먼트로 옮겨진다고 한들 액티비티가 살아있는 동안에는 뷰모델도 살아있다!
즉, ViewModel은 생명주기의 영향을 받지 않고 데이터를 유지, 보관하기 위해 사용한다고 볼 수 있다!
LiveData ?
-보통 ViewModel과 같이 사용되며, observer패턴을 구현하기 위하여 사용된다.
-관찰 가능한 일반 클래스와 달리 LiveData는 수명 주기를 인식한다.
실습
실습하기전 ViewModel을 사용해주기 위한 dependencies에 추가해준다.
//viewModel
def lifecycle_version = "2.5.0-alpha05"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
입력하는 값이 계속해서 라이브로 변화하는 것을 확인하려고 할 때 사용되기도 하지만,
회원가입처럼 뷰가 달라지면서 데이터를 서로 주고받아야 하는 상황에서도 많이 사용된다.
class SignUpViewModel : ViewModel() {
companion object{
const val TAG: String = "로그"
}
private val _currentInputId = MutableLiveData<String>("")
val currentInputId: LiveData<String> = _currentInputId
private val _currentInputPw = MutableLiveData<String>("")
val currentInputPw: LiveData<String> = _currentInputPw
private val _currentInputPhone = MutableLiveData<String>("")
val currentInputPhone: LiveData<String> = _currentInputPhone
private val _currentInputNickname = MutableLiveData<String>("")
val currentInputNickname: LiveData<String> = _currentInputNickname
fun updateInputId(input: String){
_currentInputId.value = input
}
이렇게 ViewModel을 선언해주고, 공유할 데이터(객체)를 적어준다.
private val sharedViewModel : SignUpViewModel by activityViewModels()
sharedViewModel.updateInputId(newId)
sharedViewModel.updateInputPw(newPw)
ViewModel을 사용할 프래그먼트에서 선언해주고,
회원가입에 사용될 아이디하고 비밀번호를 입력한 값을 업데이트 한 뒤 다음화면으로 넘어간다
이렇게 되면 다음 뷰에서도 아이디하고 비밀번호를 사용할 수 있게 된다!!
sharedViewModel.currentInputId.observe(viewLifecycleOwner) { currentInputId ->
requestUserData.userId = currentInputId
}
회원가입의 마지막 뷰에서 서버에게 요청할 때 뷰모델을 불러와
뷰모델에 저장되어 있는 id값을 요청할 데이터 id값에 저장만하면 끝!!
처음 입력받았던 id와 pw값을 마지막 뷰에서 사용할 수 있게 되었다!!!!!!!!!!!
어찌어찌해서 여러 자료를 찾아보다가 구현하기는 했지만
뷰모델 관련해서 공부하다가 생명주기라는 것을 알게되었고, 아직 나에겐 좀 어려운 개념같다.........
'Android > Basic' 카테고리의 다른 글
[Android] RecyclerView (2) (0) | 2022.04.29 |
---|---|
[Android] RecyclerView (0) | 2022.04.28 |
[Android] Retrofit2 사용하기 (0) | 2022.04.26 |
[Android] UnknownServiceException:CLEARTEXT communication to **** not permitted ....Error (0) | 2022.04.25 |
[Android] Splash 화면 만들기 (0) | 2022.04.24 |