当我的片段进入系统后台时,它调用onStop().然后当我的片段进入系统前台时,它调用onResume().但是mainViewModelScope不支持一个协程。
我的片段
override fun onResume() {
super.onResume()
Log.d("aaaa", "resume========")
viewModel.startFetchDeviceTimer()
}
override fun onStop() {
super.onStop()
Log.d("aaaa", "stop========")
viewModel.cancelFetchDeviceTimer()
}
override fun onDestroy() {
super.onDestroy()
Log.d("aaaa", "destroy========")
}
字符串
我的viewModel
private val mainViewModelScope = CoroutineScope(Dispatchers.Main + SupervisorJob())
fun startFetchDeviceTimer() {
startTimerActual()
}
private fun startTimerActual() {
// launchWithVM({
mainViewModelScope.launch {
while (isActive) {
Log.d(TAG, Thread.currentThread().name)
// 网络请求异步任务在IO线程的协程中
ioScope.launch {
Log.d(TAG, Thread.currentThread().name)
val deviceResponse = homeRepository.getDeviceList()
val deviceVOList = deviceResponse.deviceList.map { deviceModel ->
mapModel2VO(deviceModel)
}
deviceVOListData.postValue(deviceVOList)
}
delay(FETCH_DEVICE_INTERVAL.toDuration(DurationUnit.SECONDS))
}
}
// }, {})
}
fun cancelFetchDeviceTimer() {
if (mainViewModelScope.isActive) {
mainViewModelScope.cancel()
}
}
型
我想让mainViewModelScope在我的片段到达系统前台时启动一个协程。我怎么做?
1条答案
按热度按时间x4shl7ld1#
我测试了你的代码,它工作正常。mainViewModelScope将在每次onresume调用时运行。如果您在onStop()中取消mainViewModelScope,您可以删除它。请检查
字符串