-
LiveDataProgramming/Android 2020. 11. 6. 23:20
LiveData란?
LiveData는 Android JetPack 라이브러리 중 하나이다.
JetPack은 개발자가 관심있는 코드에 집중할 수 있도록 권장사항 준수, 상용구 코드 제거, 모든 Android 버전과 기기에서 일관되게 작동하는 코드 작성을 돕는 라이브러리 모음입니다.
쉽게 말하면, JetPack은 안드로이드 개발을 돕는 라이브러리의 모음이다. LiveData는 JetPack 의 일부이다
식별 가능한 데이터 홀더 클래스이다. 일반 클래스와 달리 LiveData는 LifeCycle를 인식하여 고려한다.
이를 통해 LiveData는 활성 LifeCycle 상태에 있는 앱 컴포넌트 Observer만 업데이트한다.
Observer 클래스로 표현되는 Observer의 생명주기가 STARTED or RESUMED 상태라면 LiveData는 관찰자를 활성 상태로 간주한다. LiveData는 활성 관찰자에게만 업데이트 정보를 알린다.
즉, LiveData는 앱 컴포넌트들의 생명주기를 알고 있기 때문에 앱 생명주기가 활성화 상태일 때만 옵저버를 통해 데이터를 수신한다. 생명주기가 끝나면 데이터를 받지 않아서 메모리 누출을 걱정하지 않아도 된다. 그래서 좋다.
LiveData의 이점
UI와 데이터 상태의 일치 보장
LiveData는 Observer Pattern을 따른다. LiveData는 생명주기가 변경될 때 Observer 객체에 알린다. 코드를 통합하여 이러한 Observer 객체를 통해 UI를 업데이트할 수 있다. 앱 데이터가 변경될 때 마다 UI를 업데이트 하는 게 아니라 변경이 발생할 때마다 옵저버가 UI를 업데이트할 수 있다.
Memory Leak 없음
옵저버는 Lifecycle 객체에 결합되어 있으며 연결된 생명주기가 끝나면 자동으로 삭제됨.
LifeCycle을 수동으로 처리하지 않음
최신 데이터 유지
생명주기가 비활성화되면, 다시 활성화될 때 최신 데이터를 수신한다. 예를 들어 백그라운드에 있었던 액티비티는 포그라운드로 돌아온 직후 최신 데이터를 받는다.
적절한 구성 변경?
구성변경(ex:기기 회전)으로 인해 활동이나 프래그먼트가 다시 생성되면 사용할 수 있는 최신 정보를 즉시 수신합니다.
리소스 공유
앱에서 시스템 서비스를 공유할 수 있도록 싱글톤 패턴을 사용하는 LiveData 객체를 확장하여 시스템 서비스를 래핑할 수 있다. LiveData 객체가 시스템 서비스에 한 번 연결되면 리소스가 필요한 모든 관찰자가 LiveData 객체를 볼 수 있다.?
LiveData 객체 업데이트
- setValue() : 메인 쓰레드에서 LiveData 객체를 업데이트 할 때 사용
- postValue() : 백그라운드에서 LiveData를 업데이트 할 때 사용
postValue()를 호출하면, 내부적으로 아래 코드가 실행된다고 한다.
new Handler(Looper.mainLooper()).post(() -> setValue())
따라서 postValue()를 한 다음 바로 다음 라인에서 LiveData의 getValue()를 호출한다면, 변경된 값을 받아오지 못할 가능성이 크다.
반면, setValue()로 값을 변경하면 메인쓰레드에서 변경하는 것이기 때문에 바로 다음 라인에서 getValue()로 변경된 값을 읽어올 수 있다.
LiveData 은닉
class UserProfileViewModel: ViewModel(){ //MutableLiveData란 변경할 수 있는 LiveData 형입니다. //일반적인 LiveData형은 변경할 수 없고 오로지 데이터의 변경값만을 소비하는데 반해 //MutableLiveData는 데이터를 UI Thread와 Background Thread에서 선택적으로 바꿀 수 있습니다. private val _post = MutableLiveDta<User>() // _post로 선언된 MutableLiveData를 post를 통해 발행합니다. // 이렇듯 ViewModel에서만 _post를 변경할 수 있기때문에 보안에 더 좋습니다. val post :LiveData<Post> get() = _post }
class PostActivity():AppCompatActivity(){ override fun onCreate(savedInstacneState:Bundle?){ //조금전 ViewModel에서 post LiveData를 Observe합니다. //첫번째 인자는 UI이며 해당 인자로 어떤 UI Thread를 사용할지 결정합니다. //두번째는 Observe 콜백입니다. postViewModel.post.observe(this, Observer{ post -> postTitle.text = post?.title } ) } }
developer.android.com/topic/libraries/architecture/livedata?hl=ko
LiveData 개요 | Android 개발자 | Android Developers
LiveData를 사용하여 수명 주기를 인식하는 방식으로 데이터를 처리합니다.
developer.android.com
wooooooak.github.io/android/2019/06/11/Android_liveData_value/
AAC LiveData setValue() vs postValue() · 쾌락코딩
AAC LiveData setValue() vs postValue() 11 Jun 2019 | AAC LiveData AAC ViewModel을 사용하면서 구글이 제공하는 LiveData를 많이 사용한다. LiveData는 setValue()와 postValue()메서드를 제공한다. 두가지 메소드 모두 MutableLiv
wooooooak.github.io
medium.com/harrythegreat/jetpack-android-livedata-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-ed49a6f17de3
Jetpack Android — LiveData 알아보기
LiveData? 특이한 이름입니다. 살아있는 데이터? 네이밍을 어떻게 한건지는 모르겠지만 LiveCycle을 알고있는 DataType이라고하면 더 와닿을것같습니다. 그러면 LiveCycle을 알면 뭐가 좋은데?라는 생각이
medium.com
'Programming > Android' 카테고리의 다른 글
Manifest/Gradle/4대 Component/ConstraintLayout (0) 2020.11.25 [Android] Toolbar Menu Icon Shadow 효과 적용 (2) 2020.11.12 [Android] Android App Architecture Guide (0) 2020.09.17 [Android] Repository Pattern 의 이해 (0) 2020.09.17 REST API : 웹상의 자원에 접근하는 방식을 정의한 아키텍처 (0) 2020.09.13