티스토리 뷰
LiveData : A lifecycle aware observable data holder class
LiveData의 간단한 소개
이전 글 : dduntorry.tistory.com/entry/Android-LiveData
LiveData 소개
LiveData에 대한 안드로이드 공식문서입니다. https://developer.android.com/topic/libraries/architecture/livedata.html LiveData 개요 | Android 개발자 | Android Developers LiveData를 사용하여 수명..
dduntorry.tistory.com
안드로이드에는 3가지 앱 구성요소가 있습니다.
Activity, Fragment, Service
이 3가지 앱 구성요소는 LiveData 객체의 옵저버가 될 수 있습니다.
LiveData는 활성화 된 생명주기 상태에서 옵저버만 업데이트 시킬 수 있습니다.
Rx를 쓸 때, Activity, Fragment, Service가 활동상태가 아니라면 우린 옵저버를 표출하는데에 조심해야 합니다.
하지만! LiveData를 쓰면 걱정 할 필요가 없습니다!
LiveData는 앱 데이터가 변경될 때, 자동적으로 UI를 업데이트 시켜줍니다.
그러므로 LiveData를 쓰면 항상 최신 데이터를 반영하죠.
또한, LiveData를 쓰면 생명주기를 수동으로 처리하기 위해 코드를 작성 할 필요가 없습니다.
생명주기가 Destroy 되면 이 생명주기와 연관 된 LiveData는 스스로 사라지게 되니까요.
그러므로 Activity, Fragment가 Destroy 되는 결과로 인해 메모리 leak나 crush가 일어날 일이 없답니다.
마지막으로 LiveData를 씀으로써 앱의 서로 다른 구성요소간의 앱 서비스를 공유할 수 있답니다~
MutableLiveData : Sub Class of LiveData
LiveData 객체 안에 있는 데이터는 수정이 불가능 하고 읽기만 가능합니다. 즉 데이터를 직접 업데이트 할 수 없죠.
하지만 MutableLiveData는 데이터를 변경 수정할 수 있게 해줍니다.
LiveData 실습
이전 ViewModelFactory 블로그 포스팅의 실습 코드로 해보겠습니다.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText
android:id="@+id/input_edit_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="number"
android:textSize="36sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.323"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.064" />
<Button
android:id="@+id/insert_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="50dp"
android:layout_marginTop="40dp"
android:text="Add"
android:textSize="36sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/input_edit_text" />
<TextView
android:id="@+id/result_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="45dp"
android:layout_marginTop="32dp"
android:layout_marginEnd="41dp"
android:textSize="36sp"
app:layout_constraintEnd_toEndOf="@+id/insert_button"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/insert_button" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
MainActivityViewModel
class MainActivityViewModel(
startingTotal : Int
) : ViewModel() {
private var total = MutableLiveData<Int>()
val totalData : LiveData<Int>
get() = total
init {
total.value = startingTotal
}
fun setTotal(input:Int){
total.value =(total.value)?.plus(input)
}
}
이 전 ViewModelFactory의 실습 코드를 보면 아래와 같습니다.
class MainActivityViewModel(
startingTotal: Int
) : ViewModel() {
private var total=0
init {
total = startingTotal
}
fun getTotal(): Int {
return total
}
fun setTotal(input: Int) {
total+=input
}
}
total 변수는 항상 업데이트 되어야 하는 데이터입니다. 따라서 MutableLiveData가 되어야 하죠.
MutableLiveData 이므로 startingTotal 값을 할당 받을 수 있습니다.
그리고 캡슐화로 total을 totalData: LiveData 로 감싸준 뒤, 코틀린 get 메소드를 써서 getter를 대체합니다.
totalData는 LiveData 인데 total을 받을 수 있는 이유는 MutableLiveData가 LiveData의 하위 클래스이기 때문이랍니다~
MainActivityViewModelFactory
class MainActivityViewModelFactory(private val startingTotal : Int) : ViewModelProvider.Factory{
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(MainActivityViewModel::class.java)){
return MainActivityViewModel(startingTotal) as T
}
throw IllegalArgumentException("Unknown View Model Class")
}
}
ViewModelFactory는 ViewModel이 인자를 가질 때 사용합니다
이전 블로그 포스팅 : dduntorry.tistory.com/entry/Android-ViewModelFactory
[Android] ViewModelFactory
ViewModelFactory는 ViewModel을 통해 전달되는 인자가 있을 때 사용됩니다 class MainActivityViewModel( startingTotal: Int ) : ViewModel() { } 위와 같이 전달 인자가 있으면 사용해요 ViewModelFactory 실습..
dduntorry.tistory.com
MainActivity
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var viewModel: MainActivityViewModel
private lateinit var viewModelFactory: MainActivityViewModelFactory
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
viewModelFactory = MainActivityViewModelFactory(125)
viewModel = ViewModelProvider(this,viewModelFactory).get(MainActivityViewModel::class.java)
viewModel.totalData.observe(this, Observer {
binding.resultTextView.text = it.toString()
})
binding.insertButton.setOnClickListener {
viewModel.setTotal(binding.inputEditText.text.toString().toInt())
}
}
}
this : MainActivity의 it(Int, 업데이트 되는 데이터)를 옵저빙하며 항상 최신 데이터를 유지합니다.
이로써 LiveData 실습을 마치겠습니다
'Android' 카테고리의 다른 글
[Android] ViewModelFactory (0) | 2021.03.07 |
---|---|
[Android] ViewModel (0) | 2021.03.06 |
[Android] DataBinding (0) | 2021.03.02 |
[Android] MVVM 패턴 (0) | 2020.08.11 |
[Android] LiveData 소개 (0) | 2020.08.10 |
- Total
- Today
- Yesterday
- MutableLiveData
- Java
- 자바
- Eclipse
- 제어의 역행
- tomcat
- 이클립스
- Framework
- listview
- 로그인
- Android
- Enterkey
- kotiln
- AOP
- POJO
- 스프링
- spring
- ADAPTER
- setOnKeyListener
- ViewModelFactory
- 자동로그인
- livedata
- Kotlin
- CustomListView
- SharedPreferences
- 스택제거
- ViewModel
- 안드로이드
- DataBinding
- 톰캣
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
31 |