안드로이드

[Android/안드로이드] Flow colect 취소하기/cancellable Flow

알통몬_ 2023. 1. 26. 16:33
반응형

Flow를 취소할 수 있는 거 아시나요?

상황에 따라 Flow의 collect() 를 취소해야할 수 있습니다.

val combineJob = lifecycleScope.launch {
    combine(
        viewModel.socketClose,
        connectionViewModelV2.networkState, viewModel.state
    ) { socketClose, networkState, selfStudyListState ->
        Timber.tag("socketClose").d("$socketClose")
        Timber.tag("networkState").d("$networkState")
        when (networkState) {
            is NetworkState.Connected -> {
                network = true
                if (socketClose) {
                    showSocketProgressDialog()
                    Timber.tag("showProgressDialog").d("1")
                    viewModel.runStomp()
                    Timber.tag("showProgressDialog").d("2")
                } else {
                    hideSocketProgressDialog()
                    Timber.tag("RETRY").e("$getListRetryCount")
                    if (selfStudyListState.isError) {
                        if (getListRetryCount <= 3) {
                            viewModel.fetchContentsItems(
                                sharedPref.getToken(SharedPrefDataStorage.PREF_KEEP_LOGIN_TOKEN)
                            )
                            getListRetryCount += 1
                        } else {
                            binding.errorCard.visibility = View.VISIBLE
                        }
                    }
                }

            }
            else -> {
                network = false
                Timber.tag("howManyTimes").d("howManyTime")
                wifiDisconnectedPopup()
            }

        }


    }.cancellable().collect()
}

combineJob.cancel() // flow가 담긴 job을 취소한다.

 

Flow 를 cancellable() 하면 Job을 통해 Flow의 collect 작업을 취소할 수 있습니다.

또한 취소 되었는데 flow의 cancel() 통해 boolean 값을 반환받을 수 있습니다.

MutableStateFlow의 경우 StateFlowImpl 을 반환합니다.

@Suppress("FunctionName")
public fun <T> MutableStateFlow(value: T): MutableStateFlow<T> = StateFlowImpl(value ?: NULL)

StateFlowImpl 을 따라가 보면 CancellableFlow<T> 를 interface를 구현합니다.

private class StateFlowImpl<T>(
    initialState: Any // T | NULL
) : AbstractSharedFlow<StateFlowSlot>(), MutableStateFlow<T>, CancellableFlow<T>, FusibleFlow<T> {

 

그렇기 때문에 MutableStateFlow는 cancellable()을 호출하지 않아도 job을 통해 collect 를 취소할 수 있습니다.

감사합니다.

반응형