Android/AAC
[Android] LiveData 기본 개념
Heeg's
2020. 6. 20. 00:10
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