original source : https://medium.com/@cs.ibrahimyilmaz/viewlifecycleowner-vs-this-a8259800367b

ViewModel은 아래와 같이 onCreate() 후에 생성되어서 activity에 연결된 ViewModel의 경우 onDestory() 후에 사라지게 된다. fragment에 연결된 ViewModel의 경우는 onDestroy()바로 이전에 사라지게 된다. 거칠게 이야기 하면 activity, fragment의 수명과 그에 연결된 ViewModel의 수명이 비슷하다고 할수 있다. 그렇다면 그안에서 생성된 LiveData 도 같은 수명을 가지게 된다. 다만 LiveData에 observe 에 전달되는  viewlifecycleowner나 this는 언제 값을 들여다 볼지를 결정한다.(여기서는 LiveData의 값이 변할때를 말하는 것이 아니다.) activity나 fragment의 주기에 따라 언제 값을 들여다볼지를 결정하는 것이다. this의 경우 onCreate() 될때 마다 들여다 본다. viewlifecycleowner의 경우는 onCreateView() 될때 마다 들여다 본다.

결과적으로 viewlifecycleowner를 사용하면 좀더 자주 확인한다는 이야기이다. 한 fragment에서 다른 fragment로 전환된 사이에 변경되었을수 있는 값을 가져와야 하는 경우 viewlifecycleowner를 사용한다.

참조) https://stackoverflow.com/a/59521748/3151712

image

As we can see from the diagram onCreate and onDestroy called once. These are Fragment mainly life cycle methods. onCreateView and onDestroyView are called according to state of Fragment because they are mainly life cycle methods of the View in Fragment.

So If we use onCreate method for binding our LiveData. Yes we register once and it seems very good and lean:

liveData.observe(this, observer)

But what will happen when we navigate to another fragment and change the value of LiveData there and get back our previous fragment

In going back to the Fragment, we cannot get recent data in LiveData and we should request it.

So it seems that using Views’s LifeCycle methods are much more useful. But in that condition. Common mistake that we do is to use Fragment as a LifeCycle owner.

//in onViewCreated, onCreateView,onActivityCreatedliveData.observe(this, observer) // Mistake!!! It can cause double observation or other problems.

we should use viewLifecycleOwner.

//in onViewCreated, onCreateView,onActivityCreatedliveData.observe(viewLifecycleOwner, observer) 

Comments are closed.

Post Navigation