쏭식
Ssongcode;
쏭식
전체 방문자
오늘
어제
  • 분류 전체보기 (106)
    • JAVA (21)
      • Basic (21)
    • Kotlin (14)
      • Basic (14)
    • Android (64)
      • Basic (24)
      • JETPACK (30)
      • Compose (8)
      • 파고들기 (2)
    • Project (4)
    • etc (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 리사이클러뷰
  • DataBinding
  • 코틀린
  • 코드업100제
  • AAC
  • Kotlin
  • 배열
  • ViewModel
  • livedata
  • mvvm
  • 컴포즈
  • 자바
  • 코테
  • 메소드
  • 코틀린코테
  • 기초100제
  • 변수
  • 객체지향
  • 상속
  • Room
  • Jetpack
  • Android
  • Adapter
  • compose
  • workmanager
  • 자료구조
  • 알고리즘
  • 프로젝트회고
  • 코딩테스트
  • 백준

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쏭식

Ssongcode;

[JETPACK개론] LiveData
Android/JETPACK

[JETPACK개론] LiveData

2022. 8. 17. 23:59

LiveData?

LiveData는 관찰 가능한 데이터 홀더 클래스이다. 관찰 가능한 일반 클래스와 달리 LiveData는 수명주기를 인식한다.

이렇게 공식문서에 정의되어있다.

즉, 쉽게 다시 설명하자면 데이터를 LiveCycle과 결합해서 관찰해줄 수 있는 것이 LiveData이다!!

 

가장 대표적인 장점 중에 하나가 UI와 데이터 상태의 일치를 보장해준다!

LiveData는 기본 데이터가 변경될 때 observer 객체에 알리고, 코드를 통합하여 이러한 observer객체에 UI를 업데이트할 수 있다.

 

다음 예시를 살펴보자!

class MainActivity : AppCompatActivity() {

    private var testMutableLiveData = MutableLiveData(0)

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

        findViewById<Button>(R.id.btnArea).setOnClickListener {
            testMutableLiveData.value = testMutableLiveData.value!!.plus(1)
        }

        //데이터가 변할 때 마다 관찰해줄 수 있는 친구
        testMutableLiveData.observe(this, Observer {
            Log.d("testMutableLiveData", testMutableLiveData.value.toString())
            findViewById<TextView>(R.id.textArea).text = testMutableLiveData.value.toString()
        })//변경될 때 마다 로그가 찍힘
        //
    }
}

현재 LiveData가 0이지만 버튼을 클릭할 때 마다 1씩 늘어난다.

이 때 observer를 통해 데이터가 변경될 때 마다 내가 직접 업데이트하는 것이 아닌 자동으로 업데이트해준다.

 

하지만 이렇게 사용하면 문제점이 있다.

화면이 뒤집어져 Activity의 생명주기가 종료된다면 데이터가 초기화되는 문제가 발생한다.

즉, 액티비티 안에서 LiveData를 사용하면 생명주기에 따라 데이터가 사라질 수 있다!!

따라서 우리는 ViewModel 과 같이 LiveData를 사용할 수 있다.

ViewModel and LiveData

class MainViewModel : ViewModel() {

    var testMutableLiveData = MutableLiveData(0)

    fun plusLiveDataValue(){
        testMutableLiveData.value = testMutableLiveData.value!!.plus(1)
    }
}
class MainActivity : AppCompatActivity() {

    lateinit var viewModel: MainViewModel

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

        viewModel = ViewModelProvider(this).get(MainViewModel::class.java)

        findViewById<Button>(R.id.btnArea).setOnClickListener {
            viewModel.plusLiveDataValue()
        }

        viewModel.testMutableLiveData.observe(this, Observer {
            findViewById<TextView>(R.id.textArea).text = viewModel.testMutableLiveData.value.toString()
        })

    }
}



액티비티가 아닌 MainViewModel에서 LiveData를 넣어준 다음 액티비티에서 값을 변경해주고, observer를 사용한다면

위의 그림과 같이 앱을 돌려 생명주기에 영향을 준다고 하더라도 값이 보존되는 것을 확인할 수 있다!!

 

ViewModel과 LiveData의 장점이 이렇게 워낙 강력하다보니 많은 분들이 MVVM패턴을 더 선호하는 것 같다

아직 MVVM패턴에 대해서 익숙하지 않지만 꼭 익혀야만 하는 기술 같다.

 

 

GitHub - SsongSik/JetPack_Android_Practice: Android practice using the Jetpack library

Android practice using the Jetpack library. Contribute to SsongSik/JetPack_Android_Practice development by creating an account on GitHub.

github.com

 

저작자표시 (새창열림)

'Android > JETPACK' 카테고리의 다른 글

[JETPACK개론] Fragment LiveData / LifeCycleOwner  (0) 2022.08.19
[JETPACK개론] LiveData 와 MutableLiveData  (0) 2022.08.18
[JETPACK개론] ViewModelFactory  (0) 2022.08.16
[JETPACK개론] Activity/Fragment 의 ViewModel 공유  (0) 2022.08.12
[JETPACK개론] ViewModel ?  (0) 2022.08.11
    'Android/JETPACK' 카테고리의 다른 글
    • [JETPACK개론] Fragment LiveData / LifeCycleOwner
    • [JETPACK개론] LiveData 와 MutableLiveData
    • [JETPACK개론] ViewModelFactory
    • [JETPACK개론] Activity/Fragment 의 ViewModel 공유
    쏭식
    쏭식

    티스토리툴바