TIL - 20 # Android One-Time Events 안드로이드 프로젝트에서 단일성 이벤트를 처리할 때 어떻게 처리하시나요? “SingleLiveEvent”를 사용하시나요? “LiveEvent”에서 “Event”를 맵핑해서 사용하시나요? 아니면 “Channel”을 사용하시나요? 아니면 “SharedFlow” 또는 “StateFlow”를 사용하시나요? 정말로 많은 공식 문서 및 아티클을 찾아봤는데 사람마다 사용하는 방법이 정말로 다양하게 있는 것 같습니다. ## Android Developer 에서 추천하는 방법? Android Developer 블로그 글을 보면 ( https://medium.com/androiddevelopers/viewmodel-one-off-event-antipatterns-16a1da869b95 ) “Channel” 및 “SharedFlow”는 백그라운드에 가서 이벤트를 들을 소비자가 없는 경우 예기치 못한 버그를 야기한다고 합니다. 따라서 StateFlow에서 캐싱 된 State를 사용하여 이벤트를 세팅한 후 끝난 후에는 State 값을 변경하여 단일성 이벤트를 처리하라고 권고합니다. 이러한 글뿐만 아니라 공식 문서상에서도( https://developer.android.com/topic/architecture/ui-layer/events?hl=ko#consuming-trigger-updates ) 이벤트 처리 후 state 값을 변경해서 처리하는 것을 알 수 있습니다. ## StateFlow로 단일성 이벤트 정말로 좋은 것인가… 모든 프로젝트에 “StateFlow”를 통해 이벤트 처리를 할 수 있으면 정말로 좋겠지만 쉽지 않은 케이스도 나오게 됩니다. 블로그 댓글만 봐도 동의하는 댓글도 있지만 비동의하는 댓글도 만만치 않게 많이 보인다는 것을 알 수 있습니다. navigation에 대한 처리가 쉽지 않을 수 있다는 의견, 다시 이벤트를 off 하는 state를 처리하지 않으면 또 다른 버그가 야기할 수 있다는 의견, 너무 코드상 복잡해진다 등 다양한 의견들이 있습니다. 저도 단순한 이벤트 처리면 StateFlow로도 가능하겠지만 정말로 다양한 유즈케이스들이 존재한다면 “StateFlow”만으로 처리하기 어렵다고 생각합니다. ## 결론? 안타깝지만 아직 명확한 답을 못 찾은 상태입니다. SingleLiveEvent, Channel, StateFlow등 각 프로젝트에 맞게 구현하는 게 현 상황에 맞는 것 같습니다. (안드로이드에서 더 좋은 솔루션을 제공하면 좋겠네요…)
최근에 본 영상에서 해당 토픽 관련해서 흥미로운 의견을 볼 수 있었습니다. 시간이 되시면 한번 보시는걸 추천드립니다. 해당 영상을 요약하면, 간단하게 사용할 거면 “SharedFlow” 에 buffer를 줘서 사용하는 방법, “Channel”을 사용하려면 Dispatcher를 “Dispatcher.Main.immediate”를 사용해서 이벤트를 처리하는 것을 추천해 주고 있습니다.