[삽질] collect가 반응하지 않을때

0

오늘 겪은 삽질입니다.

collect가 값을 collect하지 못하는 일이 발생했고, 제가 아는 원인은 단 한가지라고 생각했습니다.

LifeCycle이 onStop이나 onDestory가 되어 코루틴이 해제되었다고 생각하게 되었습니다.

하지만 또하나의 원인을 찾고 말았습니다.


(위의 코드는 단순하게 재현한 코드입니다.)

collect는 emit 하여 들어오는 녀석들을 순차적으로 처리합니다.
그리고 Flow는 collect할 때 정지하며 emit이 발생할 때마다 재개가 됩니다.
하지만 한 녀석이 영원히 안 끝나게 된다면 어떻게 될까요?

예를 들어, 종료되지 않는 Flow를 join한다면 어떤 일이 발생할까요?
updateStoreInfo()는 종료되지 않기 때문에 join() 영원히 기다리게 되고, 결국 그다음 collect가 불가능 합니다.
만약 Flow의 데이터가 단발성이라면 종료가 되고, 코루틴이 재개되겠지만 Room의 Flow는 끝나지 않기 때문에 결국 다음데이터가 오지 않습니다.

그래서 해결하려면 Room의 Flow를 OneShot인 일반 함수로 리턴하던지, collectLatest로 바꾸는 방법이 있습니다.

결국 Flow를 걷어내고 OneShot 방식으로 해결을 했습니다.

profile
쉽게 가르칠수 있도록 노력하자

0개의 댓글