TIL240711 AtomicInteger

jericho·2024년 7월 10일

TIL

목록 보기
62/62

'농부의 꿈' 앱에서 게시글 작성 시 이미지 업로드를 하면 이미지 각각을 업로드 api 통신하고 업로드된 url을 받아서 저장한 후, 게시글 등록할 때 이미지 url 리스트를 포함해서 보내도록 하고 있다.
이 때 모든 이미지의 업로드 통신 과정이 끝나서 url을 다 받지 않은 상태라면 제대로 이미지 등록이 되지 않는 문제가 있었다. 그래서 모든 이미지의 업로드가 완료될 때까지 등록 버튼을 비활성화하고자 했다.

고려할 점은 이미지 각각의 업로드가 비동기적으로 이루어진다는 것이고, 업로드를 기다리는 동안에도 새로운 이미지를 추가할 수 있기에 async 리스트를 await 하는 방식은 사용할 수 없다.
여러 구현 방법이 있겠지만, 간단하게 AtomicInteger를 이용했다.

import java.util.concurrent.atomic.AtomicInteger

private var uploadWaitingCount = AtomicInteger()

for (uri in uris) {
    viewModelScope.launch {
        uploadWaitingCount.incrementAndGet()
        updateState { copy(isFinishOk = false) }
        try {
            val url = uploadImage(uri)
            Timber.d("onAddImagesClick 코루틴 끝, url: $url")
        } catch (e: Throwable) {
            Timber.e(e, "onAddImagesClick 코루틴 에러")
        }
        uploadWaitingCount.decrementAndGet()
        updateState { copy(isFinishOk = uploadWaitingCount.get() == 0) }
    }
}

위와 같이 각 이미지 업로드에 대해 시작할 때 AtomicInteger를 증가시키고 끝날 때 감소시켜서 WaitingCount가 0이 아니라면 등록 버튼을 비활성화 하도록 구현했다.

0개의 댓글