반응형
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 를 취소할 수 있습니다.
감사합니다.
반응형
'안드로이드' 카테고리의 다른 글
[안드로이드/Android] local.properties 활용하기/변수저장하기 (0) | 2023.02.10 |
---|---|
[안드로이드/Android] Android Photo Picker directions. (0) | 2023.02.07 |
[Android Compose] Circle Image 만들기 (1) | 2023.01.09 |
"./il2cpp.exe'' finished with non-zero exit value 126 in mac (1) | 2022.11.03 |
[Kotest] Android Unit Test 한글 깨짐 해결 (0) | 2022.10.26 |