728x90
LiveData 개요
LiveData는 Data의 변경을 식별할 수 있는 데이터 홀더 클래스.
일반 클래스와 달리 LiveData는 수명 주기를 인식하며, 생명 주기가 활성화되어있는 상태에서만 Observer를 업데이트한다.
LiveData 객체에 LifecycleOwner와 함께 옵저버를 등록할 수 있다.
LiveData는 Observer가 STARTED, RESUMED 상태일 때 활성화되어있는 상태로 인식한다.
LiveData가 가지고 있는 데이터에 변화가 일어날 경우, Observer 객체에 변화를 알려주어 onChanged() 이벤트를 발생시킨다.
LiveData는 2개의 함수를 가지고 있다.
- onActive() : 활성화된 Observer수가 0에서 1로 바뀔 때 호출.
- onInactive() : 활성화된 Observer수가 1에서 0으로 바뀔 때 호출.
LiveData의 장점
- UI와 데이터 상태의 일치 보장 : 수명 주기 상태가 변경될 때 Observer 객체에 알리며, 코드를 통합하여 Observer 객체에 UI를 업데이트할 수 있다.
- 메모리 누출 방지 : Observer의 생명 주기가 끝나면 자동으로 메모리를 반환한다.
- 비정상 종료 방지 : Observer의 생명 주기 상태가 비활성 상태이면 Observer는 어떤 LiveData 이벤트도 수신하지 않는다.
- 생명주기 관리 : LiveData는 Observer의 생명 주기 상태의 변경을 인식하고 자동으로 관리한다.
- 최신 데이터 유지 : 생명주기가 비활성 상태에서 활성 상태로 변경될 때, 최신 데이터를 수신한다.
LiveData 사용 방법
- LiveData는 보통 ViewModel 내에서 함께 사용된다.
- Observer 객체를 만들고 onChange를 통해 LiveData의 data 변경을 감지할 수 있다.
- observe() 메서드를 이용하여 LiveData 객체에 Observer 객체를 연결하여 사용한다. observe() 메서드는 LifecycleOwner 객체를 사용한다.
onCreate에서 observe()를 사용하면 좋다.
- 생명 주기가 STARTED 상태가 되었을 때 Data를 바로 표현할 수 있다.
- 중복 호출을 방지. onResume과 같은 곳에서 observe를 호출하게 되면 중복 호출을 배제하기 힘들다.
public class MainActivity extends AppCompatActivity {
private viewModel vm;
private Button mBtn;
@Override
void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// viewModel
vm = ViewModelProviders.of(this).get(MainActivty.class);
// observer
final Observer<String> observer = new Observer<String>() {
@Override
public void onChanged(@Nullable final String text) {
// UI change
sampleTextView.setText(text);
}
};
// LiveData에 observer() 연결
vm.getCurrentName().observe(this, observer);
}
mBtn.setOnClickListener(new OnClickListener() {
@Ovverride
public ovid onClick(View v) {
String sampleText = st;
// LiveData 객체의 Data 변경
vm.getCurrentName().setValue(st);
}
}
}
여기서 onClickListner를 통해 버튼 클릭시 LiveData 객체의 data값을 변경해주었는데,
Main Thread에서 동작하고 있을 때는 setValue(T)를 사용하지만, Main Thread가 아닌 SubThread에서 LiveData의 값을 변경하기 위해서는 postValue(T)를 사용하여 LiveData를 업데이트 해야한다.
728x90
'Android > AAC' 카테고리의 다른 글
[Android] AAC Navigation 사용 실전 압축 정리 (0) | 2022.02.14 |
---|---|
[Android] 데이터 바인딩 어댑터 (Data Binding Adapter) 사용 방법 (0) | 2022.02.07 |
[Android] Room 라이브러리 (0) | 2020.06.22 |
[Android] ViewModel 기본 개념 (0) | 2020.06.22 |
[Android] 데이터 바인딩 (Data Binding) 기본 사용 방법 (0) | 2020.06.15 |