[Android/안드로이드] LiveData를 알아보자

JINA·2021년 9월 17일
0

Android/basic

목록 보기
4/6
post-thumbnail

👩‍💻LiveData란?

LiveData는 관찰 가능한 데이터 홀더 클래스이다. 관찰 가능한 일반 클래스와 달리 LiveData는 수명 주기를 인식한다. 즉, 활동, 프래그먼트, 서비스 등 다른 앱 구성요소의 수명 주기를 고려한다. 수명 주기 인식을 통해 LiveData는 활동 수명 주기 상태에 있는 앱 구성요소 관찰자만 업데이트한다.

LiveData사용 이점

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

  • Observer 패턴을 따름
  • LiveData는 기본 데이터가 변경될 때 Observer객체에 알려 UI를 업데이트 할 수 있음. 그러므로 앱 데이터가 변경될 때마다 관찰자가 대신 UI를 업데이트하므로 우리가 직접 업데이트 할 필요가 없음.

2. 메모리 누수 없음

  • 관찰자는 Lifecycle 객체에 결합되어 있어서 연결된 라이프사이클이 끝나면 자동으로 삭제됨

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

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

4. 수명주기를 수동으로 처리하지 않음

  • UI구성요소는 관련 데이터를 관찰하기만 할 뿐 관찰을 중지하거나 다시 시작하지 않음.

LiveData / MutableLiveData

  • LiveData는 Get만 가능하여 읽기 전용으로 데이터를 변경할 수 없음
  • MutableLiveData는 GET/SET이 모두 가능하여 데이터의 변경과 읽기 둘다 가능

setValue() / postValue()

  • setValue()는 MainThread가 보장될 경우 활용할 수 있음(MainThread 에서의 데이터 변경)
  • postValue()는 MainThread가 아닌 IO 스케줄러 활용시 활용할 수 있음(MainThread 로 데이터 전달)
    -> 두 방식 모두 UI로 값을 전달하기 위해 만들어져 있음. 데이터의 처리가 IO 스케줄러 상에서 발생해야하는 경우 Thread, Coroutines 등을 활용하여 처리해야함.

LiveData 기본사용법

  1. 종속성 추가
  2. LiveData를 사용할 곳에서 LiveData 정의하고 초기화
  3. LiveData에 Observer 달기
dependencies {
    ...
    implementation 'androidx.appcompat:appcompat:1.1.0'
    ...
}

mainActivity

var pageNumber = MutableLiveData<String>()
// LiveData의 value의 변경을 감지하고 호출함
pageNumber.observe(this, Observer {
    // it로 넘어오는 param은 LiveData의 value
    binding.numTxt.text = it
})

//liveText의 value를 변경
pageNumber.value = "${lastPageNum}"

LiveData + DataBinding 사용법

  1. 종속성 추가
  2. App 수준의 gradle에 databinding 추가
  3. xml 최상위 Layout <layout></layout> 으로 감싸주기
  4. <variable/> 추가
  5. liveData를 이용해 바꿀 텍스트에 activity의 객체인 pageNumber 추가
dependencies {
    ...
    implementation 'androidx.appcompat:appcompat:1.1.0'
    ...
}

build.gradle(:app)

 dataBinding {
        enabled = true
    }

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">

    <data>

        <import type="android.view.View" />

        <variable
            name="activity"
            type="com.example.MainActivity" />

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/backgroundLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <androidx.appcompat.widget.AppCompatTextView
            android:id="@+id/pageTxtView"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            android:layout_marginStart="@dimen/dp_48"
            android:layout_marginTop="@dimen/dp_44"
            android:textSize="@dimen/sp_32"
            android:textColor="@color/black"
            tools:text="2/34"
            android:text="@{activity.pageNumber}"
            android:includeFontPadding="false"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

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

mainActivity
databinding이랑 같이 쓰면 LiveData의 value의 변경을 감지하고 호출 할 필요없음

var pageNumber = MutableLiveData<String>()

//liveText의 value를 변경
pageNumber.value = "${lastPageNum}"

0개의 댓글