[개념] 안드로이드 LiveData (1)

쓰리원·2022년 6월 1일
0

LiveData

목록 보기
1/2
post-thumbnail

1. 들어가기 전에

옵저버 패턴 (Observer Pattern)

안드로이드 LiveData는 옵저버 패턴으로 데이터를 담으면서 상태까지 지니는 클래스라고 볼 수 있습니다. 위의 옵저버 패턴에 대한 이해가 있으면 아래의 내용을 더 수월하게 이해할 수 있습니다. 내용은 공식 문서를 바탕으로 작성되었습니다.

2. LiveData 란?

라이브 데이터는 LifeCycle을 인식할 수 있는 관찰가능한 데이터 홀더 클래스 입니다. Observer 클래스로 표현되는 관찰자의 수명 주기가 STARTED 또는 RESUMED 상태이면 LiveData는 관찰자를 활성 상태로 간주합니다. LiveData는 활성 관찰자에게만 업데이트 정보를 알립니다. LiveData 객체를 보기 위해 등록된 비활성 관찰자는 변경사항에 관한 알림을 받지 않습니다.

LifecycleOwner 인터페이스를 구현하는 객체와 페어링된 관찰자를 등록할 수 있습니다. 이 관계를 사용하면 관찰자에 대응되는 Lifecycle 객체의 상태가 DESTROYED로 변경될 때 관찰자를 삭제할 수 있습니다. 이는 특히 Activity 및 프래그먼트에 유용합니다. Activity와 프래그먼트는 LiveData 객체를 안전하게 관찰할 수 있고, 수명 주기가 끝나는 즉시 수신 거부되어 누수를 걱정하지 않아도 되기 때문입니다.

위 내용을 요약하면 생명주기를 인지하면서 데이터의 변화를 관찰할 수 있는 데이터 홀더 클래스라고 보면 될 것 같습니다. 생명 주기를 인지하기 때문에 직접 생명주기를 관리 할 필요가 없으니 굉장히 편할 것이고, 데이터의 변화를 관찰 할 수 있으니 실시간 데이터 업데이트를 하는 것에 유용할 것으로 보입니다. 그래서 안드로이드에서 주로 MVVM 디자인 패턴에서 사용되고 있습니다.

3. LiveData 사용의 이점

  • UI와 데이터 상태의 일치 보장

LiveData는 관찰자 패턴을 따릅니다. LiveData는 기본 데이터가 변경될 때 Observer 객체에 알립니다. 코드를 통합하여 이러한 Observer 객체에 UI를 업데이트할 수 있습니다. 이렇게 하면 앱 데이터가 변경될 때마다 관찰자가 대신 UI를 업데이트하므로 개발자가 업데이트할 필요가 없습니다.

  • 메모리 누수 없음

관찰자는 Lifecycle 객체에 결합되어 있으며 연결된 수명 주기가 끝나면 자동으로 삭제됩니다.

  • 중지된 활동으로 인한 비정상 종료 없음

Activity가 백 스택에 있을 때를 비롯하여 관찰자의 수명 주기가 비활성 상태에 있으면 관찰자는 어떤 LiveData 이벤트도 받지 않습니다.

  • 수명 주기를 더 이상 수동으로 처리하지 않음

UI 구성요소는 관련 데이터를 관찰하기만 할 뿐 관찰을 중지하거나 다시 시작하지 않습니다. LiveData는 관찰하는 동안 관련 수명 주기 상태의 변경을 인식하므로 이 모든 것을 자동으로 관리합니다.

  • 최신 데이터 유지

수명 주기가 비활성화되면 다시 활성화될 때 최신 데이터를 수신합니다. 예를 들어 백그라운드에 있었던 활동은 포그라운드로 돌아온 직후 최신 데이터를 받습니다.

  • 적절한 구성 변경

기기 회전과 같은 구성 변경으로 인해 활동 또는 프래그먼트가 다시 생성되면 사용 가능한 최신 데이터를 즉시 받게 됩니다.

  • 리소스 공유

앱에서 시스템 서비스를 공유할 수 있도록 싱글톤 패턴을 사용하는 LiveData 객체를 확장하여 시스템 서비스를 래핑할 수 있습니다. LiveData 객체가 시스템 서비스에 한 번 연결되면 리소스가 필요한 모든 관찰자가 LiveData 객체를 볼 수 있습니다.

4. LiveData 객체 사용

공식문서에 있는 예제를 변형하여 기본적인 구현을 해보겠습니다.

1. MainActivity.kt

class MainActivity : AppCompatActivity() {

    private lateinit var binding : ActivityMainBinding
    private var Text: MutableLiveData<String> = MutableLiveData()
    private var count = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        // LiveData의 value의 변경을 감지하고 UI값 갱신
        Text.observe(this, Observer {
            // it로 넘어오는 param은 LiveData의 value
            binding.textTest.text = it
        })

        binding.btnChange.setOnClickListener {
            // Text 자체가 아닌 Text의 value를 변경
            Text.value = "count : ${++count}"
        }
    }
}

2. activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <TextView
            android:id="@+id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="count : 0"
            app:layout_constraintBottom_toTopOf="@id/btnChange"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_chainStyle="packed" />

        <Button
            android:id="@+id/btnChange"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Plus"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/text" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

깃허브 코드 주소 : https://github.com/ilil1/LiveData

5. reference

https://developer.android.com/topic/libraries/architecture/livedata
https://developer.android.com/topic/libraries/architecture/livedata?hl=ko#extend_livedata

profile
가장 아름다운 정답은 서로의 협업안에 있다.

0개의 댓글