从非生命周期主调度器切换到 IO 调度器 class

Switch from Main dispatcher to IO dispatcher from non lifecycle class

我在我的 android 应用程序中使用协程,我有这个功能需要与 UI 和主线程通信。

private suspend fun init() : RequestProcessor<LocalData, ApiResult, ApiError>
{
    @Suppress("LeakingThis")
    _localData = listener.databaseCall()
    
    withContext(Dispatchers.IO) {
        
        if (_localData == null)
        {
            checkIfShouldFetch(null, null)
        }
        else
        {
            withContext(Dispatchers.Main) {
                
                mediatorLiveData.addSource(_localData!!) { newLocalData ->
                    mediatorLiveData.removeSource(_localData!!)
                    
                    // I want to call this from the IO thread.
                    checkIfShouldFetch(newLocalData, _localData)
                }
            }
        }
    }
    
    return this
}

我的问题是,如何从嵌套上下文(Main)回到根上下文(IO)?

当我再次调用时withContext(Dispatchers.IO)显示这个错误:暂停函数只能在协程体内调用

我需要从 IO 上下文中调用函数 checkIfShouldFetch(newLocalData, _localData),但我没有找到该怎么做它。

您需要启动协程才能在那个地方调用 withContext。在不启动协同程序的情况下,您可以尝试使用 suspendCoroutinesuspendCancellableCoroutine 暂停执行,直到触发回调:

withContext(Dispatchers.Main) {
    val newLocalData = addSource()
    checkIfShouldFetch(newLocalData, _localData)
}

suspend fun addSource(): LiveData<...> = suspendCoroutine { continuation ->
    mediatorLiveData.addSource(_localData) { newLocalData ->
        mediatorLiveData.removeSource(_localData)

        continuation.resumeWith(newLocalData)
    }
}

suspend fun checkIfShouldFetch(newLocalData: ..., _localData: ...) = withContext(Dispatchers.IO) {
    // ...
}