android kotlin-coroutine无法启动

wrrgggsh  于 12个月前  发布在  Android
关注(0)|答案(1)|浏览(121)

当我的片段进入系统后台时,它调用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在我的片段到达系统前台时启动一个协程。我怎么做?

x4shl7ld

x4shl7ld1#

我测试了你的代码,它工作正常。mainViewModelScope将在每次onresume调用时运行。如果您在onStop()中取消mainViewModelScope,您可以删除它。请检查

viewModel.cancelFetchDeviceTimer()

字符串

相关问题