• 목록 (128)
    • Android (62)
    • Back-End (2)
    • Java (3)
    • Kotlin (16)
    • CS (7)
    • 개발 서적 (12)
    • 문제 풀이 (26)

최근 글

티스토리

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
MJ_94

한 우물만 파는 기술 블로그

[안드로이드] Android Architecture Components(AAC)의 LiveData
Android

[안드로이드] Android Architecture Components(AAC)의 LiveData

2021. 3. 18. 13:55

개요

LiveData는 Activity, Fragment, Service 등 다른 앱 구성요소의 라이프사이클을 인식하는 데이터 클래스다.

라이프사이클 인식을 통해 LiveData는 Observer 클래스로 표현되는 관찰자의 활성 상태를 구분하고 업데이트 정보를 알린다.

관찰자가 활성화가 된 상태는 STARTED 또는 RESUMED 상태를 활성 상태로 간주한다.

또한 Activity나 Fragment가 LiveData 객체를 안전하게 관찰할 수 있고, 이들의 수명 주기가 끝나는 즉시 수신 거부되어 쓸데없는 메모리 누수를 걱정하지 않아도 되므로 유용하다.

 

장점

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

  • LiveData는 데이터가 변경됨과 동시에 Observer 객체에 통지함.
  • 데이터 변경시 Observer가 대신 UI를 업데이트.

2. 메모리 누수 없음

  • Observer는 수명주기를 알고 있으므로 해당 수명주기가 끝나면 자동으로 삭제됨.

3. 중지된 Activity로 인한 비정상 종료 없음

  • Activity가 백 스택에 있을 때나 Observer의 수명 주기가 비활성 상태라면 LiveData는 어떤 이벤트도 받지 않는다.

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

  • View는 관련 데이터를 관찰하기만 할 뿐 관찰을 중지하거나 다시 시작하지 않는다.
  • LiveData는 관찰하는 동안 관련 수명주기 상태의 변경을 인식하므로 자동 관리한다.

5. 최신 데이터 유지

  • 수명주기가 비활성화 되었다 다시 활성화될 때 최신 데이터를 수신한다. (백그라운드 → 포그라운드 진입 시 최신 데이터로 받음)

6. 적절한 구성 변경

  • 화면 회전과 같은 구성 변경으로 인해 Activity 또는 Fragment가 재생성되면 사용 가능한 최신 데이터를 받음

7. 리소스 공유

  • LiveData 객체가 시스템 서비스에 한 번 연결되면 리소스가 필요한 모든 Observer가 LiveData 객체를 볼 수 있다.

 

사용

LiveData는 Collections를 구현하는 List와 같은 객체를 비롯하여 모든 데이터와 함께 사용할 수 있는 래퍼다.

LiveData 객체는 아래와 같이 일반적으로 ViewModel 내부에서 작성된다.

class NameViewModel : ViewModel() {

    // String형 LiveData 생성
    val currentName: MutableLiveData<String> by lazy {
        MutableLiveData<String>()
    }

    //...
}

코드를 보면 LiveData 객체의 데이터가 따로 설정되어 만들어지지 않았다.

그 이유는

  1. Activity와 Fragment가 지나치케 커지지 않게 하기 위해서이다. 이러한 UI 컨트롤러는 데이터 표시만을 담당하지 데이터 상태를 보관하고 있지 않아야 하기 때문이다.
  2. LiveData 인스턴스를 특정 Activity나 Fragment 인스턴스에서 분리하고, 구성 변경에서 LiveData 객체가 유지되도록 하기 위해서이다.

 

이제 LiveData 객체를 관찰하는 방법을 알아보자.

우선, 대부분 onCreate()에서 LiveData 객체 관찰을 시작한다.

왜냐하면 onResume() 메소드에서 호출한다고 가정하면 중복 호출이 될 거고, 활성 상태가 되는 즉시 표시할 수 있는 데이터가 있도록 하기 위해서이다.

위에서 말했듯이 STARTED 상태가 되는 즉시 관찰자가 활성화되어 LiveData 객체에서 최신 값을 수신하여 데이터를 표시한다.

class NameActivity : AppCompatActivity() {

    private val model: NameViewModel by viewModels()

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

        //...

        // Observer 생성
        val nameObserver = Observer<String> { newName -> // newName = 수신 데이터
            // UI 업데이트
            nameTextView.text = newName
        }

        // observe 메소드에 넘기는 매개변수 this는 수명주기 주체이고, nameObserver는 관찰자
        model.currentName.observe(this, nameObserver)
    }
}

 

LiveData 객체 업데이트

LiveData 클래스에는 데이터 업데이트를 위한 공개적인 메소드가 없다.

하지만 MutableLiveData 클래스에는 setValue()와 postValue() 메소드를 지원한다.

button.setOnClickListener {
    val anotherName = "Min Jong"
    model.currentName.setValue(anotherName)
}

위의 코드처럼 setValue()를 호출하면 “Min Jong”이라는 데이터와 함께 onChanged() 메서드가 호출된다.

이 예제에서는 메인스레드에서 버튼이 눌렸을 때를 보여주느라 setValue로 LiveData 객체를 업데이트시켰지만, 만약 코드가 작업 스레드에서 실행된다면 postValue로 업데이트하는 게 좋다.

 

'Android' 카테고리의 다른 글

[Android] Serializable과 Parcelable  (0) 2021.08.05
[Android] Mac M1 Room 라이브러리 에러  (0) 2021.07.30
[안드로이드] Android Architecture Components(AAC)의 ViewModel  (0) 2021.03.18
[안드로이드] Module 수준의 Gradle  (0) 2021.03.18
[안드로이드] Room  (0) 2021.03.17
    'Android' 카테고리의 다른 글
    • [Android] Serializable과 Parcelable
    • [Android] Mac M1 Room 라이브러리 에러
    • [안드로이드] Android Architecture Components(AAC)의 ViewModel
    • [안드로이드] Module 수준의 Gradle
    MJ_94
    MJ_94
    안드로이드, 개발 관련 기술 블로그

    티스토리툴바