본문 바로가기

Android/AAC

[Android] LiveData 기본 개념

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 사용 방법

  1. LiveData는 보통 ViewModel 내에서 함께 사용된다.
  2. Observer 객체를 만들고 onChange를 통해 LiveData의 data 변경을 감지할 수 있다.
  3. 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