如何解决Kotlin协程流程未取消
我有一个UseCase类,其方法返回Flow
fun startTimeTicker(startTime: Long) = flow {
val countdownStart = System.currentTimeMillis()
for (currentTime in countdownStart..startTime step ONE_SECOND_MILLIS) {
.... irrelevant ...
emit("Some String")
delay(ONE_SECOND_MILLIS)
}
}
我正在这样收集ViewModel中的发射日期
private fun startCollecting(startTime: Long) = launch {
matchStartTimerUseCase.startTimeTicker(startTime).collect {
_startTimeCountdown.postValue(it)
}
}
,我的片段正在观察LiveData并显示值。直到我离开屏幕之前,它都按预期工作。由于launch
是用ViewModel的coroutineScope调用的,它不应该被取消并且不再发出值吗?
ViewModel的范围是在BaseViewModel中实现的,我的ViewModel从中扩展如下:
抽象类BaseViewModel( 私有val dispatcherProvider:DispatcherProvider ):ViewModel(),CoroutineScope {
override val coroutineContext: CoroutineContext
get() = job + dispatcherProvider.provideUIContext()
private val job = SupervisorJob()
override fun onCleared() {
super.onCleared()
job.cancel()
}
}
我是忘记添加一些自定义取消逻辑还是缺少其他内容吗?
解决方法
如果范围是ViewModel是Activity的生命周期ViewModelProvider(requireActivity()).get(YOUR_VIEWMODEL::class.java)
,那么除非您的Activity被销毁,否则不会调用onCleared
,但不会更改旋转。
首先,确保已调用onCleared(),如果未调用,则可以将其称为Fragment或Activity的任何生命周期方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。