LiveData
LiveData는 관찰 가능한(Observable)데이터 클래스다.
데이터 바인딩의 Observable클래스나 Rxjava의 Observable과는 달리 LiveData는 lifecycle을 통해 생명주기를 인식한다. 즉 액티비티, 프래그먼트, 서비스와 컴포넌트들의 생명 주기를 따른다.
LiveData는 데이터의 변경을 활성화된 관찰자를 통해 알린다. 주어진 LifecycleOwner의 생명주기가 STARTED 또는 RESUME 상태인 경우만 Observer를 활성(active) 상태로 간주한다.
LifecycleOwner 인터페이스를 구현하는 객체를 매개 변수로 하는 observe() 매서드를 통해 Observer를 등록할수 있다. LifecycleOwner 구현체가 DESTROYED 상태가 되면 자동으로 Observer는 내부에서 제거된다. 그래서 메모리 누수 걱정할 필요가 없음.
LiveData 사용 시의 장점은 다음과 같다.
- 1. UI와 데이터 상태의 동기화
- LiveData는 옵서버 패턴(?)을 따른다. LiveData는 생명 주기 상태변화를 Observer에게 알린다. Observer 객체에서 데이터 변경에 따른 UI를 갱신하려면 코드를 작성해야한다.
- 더보기
옵서버 패턴 : 객체의 상태 변화를 관찰하는 관찰자들. 즉 옵서버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드등을 통해 개체가 직접 목록의 각 옵서버에게 통지하도록 하는 디자인 패턴이다.
- 2. 메모리 누수 방지
- 3. Activity가 갑작이 종료 되도 안전하다
- Activity가 백스택으로 들어가는 경우와 같이 관찰자가 비활성화된 상태일때라도, LiveData로부터 어떠한 이벤트도 받지 않아 안전하다.
- 4. 생명주기 고민 x : 자동 관리
- 5. 최신의 데이터를 유지한다.
- 6. 구성 변경에 대응한다.
- 화면 회전 등과 같은 구성 변경으로 인해 재생성 되더라도 즉시 최신 데이터를 받을 수 있다.
- 7. 자원 공유하기
- LiveData를 상속하여 싱글톤 패턴으로 사용할 수도 있다. 안드로이드 시스템 서비스와 같은 곳에 한 번만 연결하고, 애플리케이션 내 어디에서나 다중으로 접근하여 이 서비스를 관찰할 수 있다.
1. MutableLiveData를 이용한 데이터 쓰기
LiveData는 데이터 읽기만 가능하므로 데이터를 쓰려면 다음 예제와 같이 MutableLiveData를 사용한다.
MutableLiveData<String> liveString = new MutableLiveData<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.live_data_activity);
liveString.postValue("Hello Charles"); //데이터 쓰기
liveString.setValue("Hello World"); //데이터 쓰기
liveString.observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
// 어떤 값을 먼저 들어올까?
}
});
}
MutableLiveData가 가진 데이터를 쓰는 매서드는 setValue()와 postValue() 매서드가 있다. 데이터를 직접 읽으려면 getValue() 매서드를 사용할 수 있다.
setValue() : 메인 스레드에서만 호출해야 한다. 이미 활성화된 Observer를 가진다면, 변경된 데이터를 onChanged(...) 콜백 메서드로부터 얻을 수 있다.
postValue() : 주로 백그라운드 스레드에서 호출하는 용도로 사용된다. 주어진 값을 설정하는 테스크를 내부에서 핸들러를 통해 메인 스레드에 전달하기 때문이다.
웨에 예를 보면 Hellow World가 먼저 들어옴.
MutableLiveData를 생성한 직후는 초깃값이 null이다. 이를 방지하고자 할수 있다.
2. 상속을 통한 LiveData 사용하기
LiveData는 Observer의 생명주기가 STARTED 또는 RESUMED인 경우 활성화 상태로 간주한다.
public class StockLiveData extends LiveData<BigDecimal> {
...
}
메소드들
- onActive() : LiveData에 활성화된 관찰자가 있는 경우 호출된다.
- onInactive() : LiveData에 활상화된 관찰자가 전혀 없는 경우 호출 된다.
- setValue() : LiveData에 값을 갱신하는 데 호출되며, 활성화된 관찰자들에게 변경을 알린다.
3. MediatorLiveData 사용하기
MutableLiveData의 하위 클래스로 다른 여러 LiveData를 관찰하고 데이터의 변경에 반응한다. 이 클래스의 특징은 자신의 활성화/비활성화 상태를 연결된 소스들에 전파한다는 것이다. 간단히 여러개의 LiveData를 mapping하기 위해 MediatorLiveData를 사용할 수 있었습니다.
'책 내용 정리 > 아키텍처를 알아야 앱 개발이 보인다' 카테고리의 다른 글
앱 아키텍처를 위한 Jetpack 컴포넌트 (0) | 2022.09.17 |
---|---|
아키텍처를 알아야 앱 개발이 보인다. (RxJava) (0) | 2022.09.03 |
아키텍처를 알아야 앱 개발이 보인다 - 1 (0) | 2022.08.31 |