You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
LiveData는 UI에 표시되는 데이터와 같이, 자주 업데이트해야 하는 데이터를 보유하는 데 사용되는 Obseravle한 Data holder class 입니다. LiveData를 통해 저희는 데이터의 변경 사항을 Observing 하고 그에 따라 UI를 업데이트 하거나 다양한 로직 처리를 해왔습니다.
그러자 LiveData에는 제한이 있습니다. LiveData의 value를 내보내면 새 관찰자가 등록될 때마다 동일한 값을 계속 내보냅니다. 즉, LiveData가 이미 값을 내보낸 이후에 관찰자가 등록되면 이전 관찰자가 value를 이미 소비했더라도 관찰자는 등록 즉시 해당 value를 받습니다.
이로 인해 동일한 데이터가 여러 번 처리되는 경우, 의도하지 않은 동작이 발생할 수 있습니다. 동일한 작업을 여러 번 트리거 하지 않도록 저희는 수동적으로 처리 여부를 확인하는 코드를 작성하고는 했었습니다.
그렇다면 어떻게 해결하는 것이 좋은가?
이 문제를 해결하기 위해서 현업에서는 EventObserver를 사용합니다. Event는 단순히 관찰해야 하는 데이터를 감싸는 Wrapper이며, EventObserver는 이 Event를 한 번만 소비하는 역할을 합니다. Event가 Observe 된 후에 Event를 "소비됨"으로 식별하여 나중에 다시 트리거하지 않도록 합니다.
이렇게 하면 이벤트가 한 번만 처리되어 동일한 데이터가 여러 번 처리될 때 발생할 수 있는 의도하지 않은 동작을 방지할 수 있습니다. 또한 이벤트가 이미 처리되었는지 여부를 수동으로 추적할 필요가 없어 코드를 단순화합니다.
기존 LiveData의 문제점?
LiveData는 UI에 표시되는 데이터와 같이, 자주 업데이트해야 하는 데이터를 보유하는 데 사용되는
Obseravle
한Data holder class
입니다. LiveData를 통해 저희는 데이터의 변경 사항을 Observing 하고 그에 따라 UI를 업데이트 하거나 다양한 로직 처리를 해왔습니다.그러자 LiveData에는 제한이 있습니다. LiveData의 value를 내보내면 새 관찰자가 등록될 때마다 동일한 값을 계속 내보냅니다. 즉, LiveData가 이미 값을 내보낸 이후에 관찰자가 등록되면 이전 관찰자가 value를 이미 소비했더라도 관찰자는 등록 즉시 해당 value를 받습니다.
이로 인해 동일한 데이터가 여러 번 처리되는 경우, 의도하지 않은 동작이 발생할 수 있습니다. 동일한 작업을 여러 번 트리거 하지 않도록 저희는 수동적으로 처리 여부를 확인하는 코드를 작성하고는 했었습니다.
그렇다면 어떻게 해결하는 것이 좋은가?
이 문제를 해결하기 위해서 현업에서는 EventObserver를 사용합니다. Event는 단순히 관찰해야 하는 데이터를 감싸는 Wrapper이며, EventObserver는 이 Event를 한 번만 소비하는 역할을 합니다. Event가 Observe 된 후에 Event를 "소비됨"으로 식별하여 나중에 다시 트리거하지 않도록 합니다.
이렇게 하면 이벤트가 한 번만 처리되어 동일한 데이터가 여러 번 처리될 때 발생할 수 있는 의도하지 않은 동작을 방지할 수 있습니다. 또한 이벤트가 이미 처리되었는지 여부를 수동으로 추적할 필요가 없어 코드를 단순화합니다.
아래의 코드를 붙여드립니다. 앞으로 작업하실 때 사용하시면 좋을 것 같아 공유드립니다~
아래는 공식적인 샘플입니다. 참고하세요!
https://github.com/android/architecture-samples/blob/dev-dagger/app/src/main/java/com/example/android/architecture/blueprints/todoapp/Event.kt
The text was updated successfully, but these errors were encountered: