엄코딩의 개발 일지

 LiveData란?



LiveData는 관찰가능한 데이터들의 홀더 클래스라고 할 수 있다. 일반적인 옵저버(observer)들과 다르게 

   

   LiveData는 Activity/Fragment/Service 등과 같은 컴포넌트 라이프사이클과 연결되어있다.


   이러한 경우 컴포넌트가 Destroy되면 자동적으로 변화에 대한 관찰을 멈춘다. 그리고 사용하지 않는 할당된


   메모리를 배출함으로써 메모리 누수를 막을 수 있다.



 LiveData 장점



- Ensures yout UI matches your data state ( UI를 당신의 데이터 상태와 일치시킬 수 있다. )


LiveData는 옵저버 패턴을 따르고 있다. 즉, lifecycle state에 변화가 생기면 옵저버 object에 


알려준다. 그러므로 개발자는 옵저버를 통해 UI가 갱신되도록 코딩할 수 있다.



- No memory leaks ( 메모리 누수를 방지할 수 있다. )


옵저버들은 lifecycle 객체와 연결되어 해당 lifecycle 객체가 destroy되면 자동적으로 지워진다.



- No crashes due to stopped activities( 정지된 액티비티들 떄문에 충돌날 일이 없다.  )


옵저버의 lifecycle가 비활성화되어있는 경우 ( 액티비티가 백스택에 있는 경우 ) 옵저버는 어떠한 LiveData


이벤트들을 받지 않는다.



- No more manual lifecycle handling( 더이상 lifecycle를 handling할 필요가 없다. )


UI 컴포넌트는 단지 관련된 data만 관찰한다. RESUME / STOP 과 상관없다.


LiveData가 자동으로 lifecycle 상태변화를 감지하여 알아서 data를 관리해준다.


- Always up to date data ( 항상 최신의 데이터 )


생명 주기가 변할 때 UI 컴포넌트는 최신의 데이터를 받는다.


- Proper configuration changes ( 변화에 대한 적절한 대응 )


액티비티나 프레그먼트의 특성이 변경되어 재생성될 때, ( 장치 회전과 같은 상황 ) 즉각적으로 최신의 


데이터를 이용할 수 있다.


- Sharing resources ( 자원 공유 )


싱글턴 패턴을 사용하여 시스템 서비스를 래핑후 LiveData를 확장하여 앱에서 공유할 수 있다.


LiveData 객체는 시스템 서비스에 한 번 연결하면, 자원을 필요로하는 어떠한 옵저버에서 사용 할 수 있다.






 LiveData 사용 예제



app level gradle 추가

implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.0.0-alpha1"
implementation "android.arch.lifecycle:extensions:1.1.1"
annotationProcessor "android.arch.lifecycle:compiler:1.1.1"


{"date":"2018-05-18T04:23:35.925Z","qwe":65465}


저는 RxJava를 이용하여 LiveData를 확인하기 위해 위와 같은 데이터를 통신하여 받아왔습니다.


데이터 모델은 다음과 같습니다.


data class TestModel(var date : String, var qwe : Int) :ViewModel()


해당 데이터들을 받아온 후 MutableLiveData를 생성해줍니다.


public class NameViewModel extends ViewModel {


private MutableLiveData<TestModel> nModel;

public MutableLiveData<TestModel> getModel() {
if (nModel == null) {
nModel = new MutableLiveData<TestModel>();
}
return nModel;
}


}
override fun onRxNetSuccess(result: TestModel) {
mModel!!.model.value = result
Toast.makeText(this@MainActivity,"onRxNetSuccess!",Toast.LENGTH_LONG).show()
}


통신이 성공한 시점에서 setValue를 해줍니다. 


setValue 메소드를 호출하면 옵저버들은 값이 바뀐 데이터

 

( 통신 결과 후 변경된 데이터 )로 onChanged() 메소드를 호출합니다.


네트워크 요청 외에 데이터베이스 조회 등 다양한 상황에서 데이터를 바꾸고 싶을 때 setValue()메소드를 


사용합니다. ( postValue()도 존재 )



** 메인 스레드에서 LiveData를 갱신하려면 반드시 setValue 메소드를 호출해야 한다.

    만약, 작업 스레드에서 LiveData를 갱신하려면 postValue 메소드를 호출해야 한다.




mModel= ViewModelProviders.of(this)!!.get(NameViewModel::class.java)

var nameObserver = object : Observer<TestModel>{

override fun onChanged(t: TestModel?) {
Toast.makeText(this@MainActivity,"date",Toast.LENGTH_LONG).show()
log_tv.text = t!!.date
}
}

mModel!!.model.observe(this,nameObserver)


mModel= ViewModelProviders.of(this)!!.get(NameViewModel::class.java)

액티비티에서 ViewModel을 얻은후에 옵저버를 사용하여 UI를 갱신할 수 있습니다.



mModel!!.model.observe(this,nameObserver)

LiveData를 관찰하고, 액티비티를 LifecyclerOwner과 옵저버로 전달합니다.








참고 사이트 : https://developer.android.com/topic/libraries/architecture/livedata

http://dktfrmaster.blogspot.kr/2018/02/livedata.html