ABOUT ME

dddd-

Today
-
Yesterday
-
Total
-
  • [LiveData] 안드로이드 LiveData 기본 사용법 - 기본 예제
    Android/개발 2020. 2. 3. 21:07


    안드로이드 LiveData 기본 사용법 알아보기 - 기본 예제









     오늘은 Android JetPack 중 하나인 LiveData에 대해 알아보도록 하겠습니다. LiveData는 Activity, Fragment 등의 LifeCycle을 인식하여 LifeCycle 내에서만 동작하는 요소로 LifeCycle이 종료되면 같이 삭제됩니다. 그러므로 메모리 누출이 없고 수명주기에 따른 데이터 관리를 개발자가 하지 않아도 된다는 점 등 많은 이점을 가지고 있습니다.

     LiveData의 기본적인 사용법을 알아보면서 어떤 상황에서 어떻게 쓰면 좋을지 코드를 보며 얘기해 보도록 하겠습니다.

     LiveData에 대해 좀 더 자세한 내용을 보고싶으시면 아래 Android 개발자 사이트에서 확인해주시기 바랍니다.


     Android Developer LiveData 개요



     아래 예제는 kotlin으로 진행 될 예정이니 kotlin을 잘 모르시는 분은 아래 예제를 보고 오시기 바랍니다.


     Kotlin 기본 문법

     Kotlin vs. Java - 코틀린, 자바 차이점 비교



     LiveData를 사용하기 위해서는 app의 build.gradle 파일에 androidx의 appcompat 종속성을 추가하기만 하면 사용 준비가 완료됩니다. 보통 프로젝트 생성시 아래와 같은 CheckBox에 체크를 해주면 자동으로 추가됩니다.






     그럼 코드를 보면서 설명하겠습니다.


    1. App 수준의 build.gradle 종속성 확인


    build.gradle(Module: app) 확인

    dependencies {
    ...
    implementation 'androidx.appcompat:appcompat:1.1.0'
    ...
    }

    - 위와 같은 종송석이 추가 되어있어야 합니다.





    2. LiveData를 사용할 곳에서 LiveData 정의


    MainActivity.kt

    private var liveText: MutableLiveData<String> = MutableLiveData()

    - 위와 같은 변수를 정의하고 초기화 해줍니다.

    - LiveData는 abstract class이기 때문에 LiveData Class를 상속받은 MutableLiveData를 사용합니다.





    3. LiveData에 Observer 달기


    MainActivity.kt

    // LiveData의 value의 변경을 감지하고 호출
    liveText.observe(this, Observer {
    // it로 넘어오는 param은 LiveData의 value
    })

    - 첫 번째 매개변수인 this는 LifeCycleOwner인 MainActivity 입니다.

    - 두 번째 매개변수인 Observer Callback은 LiveData(liveText)의 value의 변경을 감지하고 호출되는 부분입니다.





     위와 같이 LiveData를 선언 및 초기화를 시켜주고 LiveData에 Observer를 달면 사용준비는 끝납니다. 그럼 이제 위 소스코드를 이용해 Button을 누르면 TextView의 Text가 바뀌는 예제를 만들어 보겠습니다.





    LiveData를 이용해 Button을 누르면 TextView의 숫자를

    1씩 증가시키기


    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
    android:id="@+id/text_test"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World!"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toTopOf="@id/btn_change"
    app:layout_constraintVertical_chainStyle="packed"/>

    <Button
    android:id="@+id/btn_change"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="ADD 1"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@id/text_test"
    app:layout_constraintBottom_toBottomOf="parent"/>

    </androidx.constraintlayout.widget.ConstraintLayout>

    - 숫자를 변경 시켜줄 Button과 숫자가 표시될 TextView 입니다.




    MainActivity.kt

    package com.imaec.livedataex

    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import androidx.lifecycle.MutableLiveData
    import androidx.lifecycle.Observer
    import kotlinx.android.synthetic.main.activity_main.*

    class MainActivity : AppCompatActivity() {

    private var liveText: MutableLiveData<String> = MutableLiveData()
    private var count = 0 // button을 누르면 증가 될 숫자

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

    // LiveData의 value의 변경을 감지하고 호출
    liveText.observe(this, Observer {
    // it로 넘어오는 param은 LiveData의 value
    text_test.text = it
    })

    btn_change.setOnClickListener {
    // liveText의 value를 변경
    // liveText 자체를 변경시키면 안됨
    liveText.value = "Hello World! ${++count}"
    }
    }
    }

    - [1] Button을 누르면 liveText의 value가 변경되고

    - [2] liveText의 value가 변경되면 Observer Callback이 호출되어 text_test.text = it 가 실행됩니다.





    실행결과






     위와 같은 실행결과가 나오게 됩니다.


     그리고 LiveData의 값을 초기에 지정해주는 방법은 여러가지가 있는데 두 가지만 알아보자면 하나는 kotlin의 apply block을 사용하는 것이고 하나는 kotlin의 extension function을 사용하는 방법이 있습니다.


    첫 번째 방법인 apply block을 사용하는 방법은

    private var liveText: MutableLiveData<String> = MutableLiveData<String>().apply {
    value = "Hello World! ${++count}"
    }

    이렇게 초기화시 apply block을 이용하여 value 값을 set 해주는 방법이 있습니다. 위와 같이 apply를 사용할 땐 MutableLiveData의 생성자에 Type을 꼭 지정해주셔야 합니다.


    두 번째 방법인 extension function을 사용하는 방법은

    1. 함수정의

    /**
    * MutableLiveData의 value를 정의 해주는 함수
    * @param value MutableLiveData의 value
    * @return MutableLiveData의 instance
    */
    private fun MutableLiveData<String>.set(value: String) : MutableLiveData<String> {
    this.value = value
    return this
    }

    2. 사용

    private var liveText: MutableLiveData<String> = MutableLiveData<String>().set("Hello World! ${++count}")

     이런 식의 함수 구현과 호출을 이용해서 LiveData의 value를 초기에 지정해 줄 수 있습니다.






     위 예제는 LiveData의 기본 사용법을 알아보는 간단한 예제였지만 DataBinding과 같이 사용하면 더욱 더 편리한 사용이 될 수 있습니다. 실제로 위의 Observer를 사용하지 않아도 xml 파일에서 live data를 binding 시켜준다면 data가 바뀔때 TextView 등의 값이 자동으로 바뀌고 ImageView의 Image가 바뀔때도 자동으로 바뀌는 놀라운 경험을 할 수 있습니다.

     앞서 DataBinding의 기본 사용을 알아보았고 이번에 LiveData의 기본 사용법을 알아보았으니 다음은 DataBinding과 LiveData를 같이 사용하는 방법을 알아보도록 하겠습니다.



     * DataBinding의 기본사용법 

     안드로이드 DataBinding 기본 사용법


     궁금하신 점은 댓글 달아주시면 대답해 드리겠습니다!^^



    DataBinding, LiveData 함께 사용하는 방법

    안드로이드 DataBinding과 LiveData 같이 사용하기


    BindingAdapter 사용법

    안드로이드 DataBinding에 BindingAdapter 사용법





    댓글

Designed by Tistory.