[Android] LiveData

💡Android Jetpack 구성요소인 LiveData에 대하여 기록하였습니다.

 

LiveData

  • LiveData는 안드로이드 아키텍처 컴포넌트 중 하나로, 관찰 가능한 데이터 홀더 클래스입니다.
  • UI와 데이터의 변경 사항을 반영하고, Observer에게 자동으로 알려줍니다.
  • 일반 클래스와 달리 생명 주기를 인식하여 Activity, Fragment, Service 등 다른 앱 구성요소의 생명 주기를 인식합니다.

LiveData 개요  |  Android Developers

 

LiveData 개요  |  Android Developers

LiveData를 사용하여 수명 주기를 인식하는 방식으로 데이터를 처리합니다.

developer.android.com

생명주기 인식

  • LiveData는 Activity, Fragment 등의 생명주기를 알고 있습니다.
  • 데이터가 변경되더라도 UI 컴포넌트가 활성 상태일 때만 업데이트 됩니다.

활성 상태

  • Activity 또는 Fragment가 STARTED 또는 RESUMED 상태에 있는 것을 의미합니다.

자동 데이터 업데이트

  • LiveData는 Observer 패턴을 사용하여 데이터 변경 시 자동으로 UI 업데이트가 가능합니다.
  • ViewModel에서 데이터가 변경되면 Observer에 등록된 UI 컴포넌트가 자동으로 이를 반영합니다.

데이터 일관성 유지

  • LIveData는 데이터 일관성을 유지하기 위해 Activity나 Fragment가 비활성화 상태일 때 데이터를 업데이트하지 않으며, 다시 활성화될 때 최신 데이터를 제공합니다.

메모리 누수 방지

  • LiveData는 Activity, Fragment가 소멸되면 자동으로 Observer를 해제하므로 메모리 누수를 방지합니다.

LifecycleOwner

  • LifecycleOwner는 Android에서 Lifecycle을 추적하고 관리할 수 있는 객체입니다.
  • Activity, Fragment, ViewModel 등에서 사용되며 생명주기를 추적하여 LifecycleObserver와 같은 컴포넌트가 생명주기의 특정 상태에 맞춰 적절한 동작을 할 수 있게 합니다.
  • 이는 아키텍처 컴포넌트의 중요한 인터페이스이며, 이를 통해 컴포넌트의 생명주기 상태를 쉽게 관리할 수 있습니다.
interface LifecycleOwner {
    fun getLifecycle(): Lifecycle
}

LifecycleObserver

  • LifecycleOwner가 생명주기를 소유하면, LifecycleObserver는 이를 관찰하는 역할을 합니다.
  • LifecycleObserver는 특정 이벤트에 반응하여 이를 처리할 수 있습니다.
class MyObserver : LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun onStartEvent() {
        Log.d("MyObserver", "Activity가 시작되었습니다.")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun onStopEvent() {
        Log.d("MyObserver", "Activity가 중지되었습니다.")
    }
}

LifecycleOwner의 생명주기 상태

  • LifecycleOwner는 아래와 같은 생명 주기 상태 변화를 가지며 생명주기가 변하면 이를 LifecycleObserver에게 알립니다.
    • INITIALIZED : 초기화 상태
    • CREATED : onCreate() 호출 후 상태
    • STARTED : onStart() 호출 후 상태
    • RESUMED : onResume() 호출 후 상태
    • DESTROYED : onDestroy() 호출 후 상태

observeForever(Observer)

  • 일반적으로 observe() 메서드를 사용하여 Observer를 LiveData에 연결하고, observe() 메소드가 LifecycleOwner를 가져오게 됩니다.

observeForever(Observer) 메소드를 사용하여 연결 된 LifecycleOwner 없이 Observer를 등록할 수 있습니다. 이 경우 Observer는 항상 활성 상태로 간주되므로 수정 관련 알림을 받게 됩니다.

LiveData 활용

  • 일반적으로 LiveData는 ViewModel과 함께 활용됩니다.
class MyViewModel : ViewModel() {
    // LiveData 선언
    private val _data = MutableLiveData<String>()
    val data: LiveData<String> = _data

    // 데이터 업데이트
    fun updateData(newData: String) {
        _data.value = newData
    }
}
  • [MutableLiveData] : 내부에서 값을 변경할 수 있는 LiveData로 ViewModel 내에서 데이터 업데이트가 필요한 경우 활용합니다.
  • [LiveData] : 외부에서는 데이터를 읽기만 할 수 있도록 LiveData로 노출합니다.
    • 캡슐화를 통해 외부에서 직접 데이터를 변경하지 못하도록 보호합니다.

Activity & Fragment에서 LiveData 관찰

class MainActivity : AppCompatActivity() {

    private lateinit var viewModel: MyViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // ViewModel 초기화
        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

        // LiveData 관찰
        viewModel.data.observe(this, Observer { updatedData ->
            // 데이터가 변경되면 UI 업데이트
            textView.text = updatedData
        })

        // 데이터 변경
        button.setOnClickListener {
            viewModel.updateData("새로운 데이터")
        }
    }
}
  • ovserve : LiveData가 변경될 때마다 Observer가 호출되어 UI를 업데이트합니다.
  • this(Activity) or viewLifecycleOwner(Fragment)를 통해 생명주기를 인식하여, 해당 컴포넌트가 RESUMED 상태일 때만 데이터를 받습니다.

setValue()

  • 메인 스레드에서만 호출 가능하며 UI 관련 작엡에서 사용됩니다.
_mutableData.value = "new value"

postValue()

  • 백그라운드 스레드에서 호출할 수 있으며, 비동기로 값을 설정합니다.
_mutableData.postValue("new value")

정리

  • LiveData는 Android 생명주기 인식 데이터 홀더 클래스로 UI와 데이터의 일관성을 유지하고, 데이터 변경 시 자동으로 UI 업데이트를 처리하는 기능을 제공합니다.
  • ViewModel과 함께 사용하면 UI 데이터를 쉽게 관리하고, 구성 변경에도 데이터를 안전하게 유지할 수 있습니다.