从非生命周期主调度器切换到 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
。在不启动协同程序的情况下,您可以尝试使用 suspendCoroutine
或 suspendCancellableCoroutine
暂停执行,直到触发回调:
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) {
// ...
}
我在我的 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
。在不启动协同程序的情况下,您可以尝试使用 suspendCoroutine
或 suspendCancellableCoroutine
暂停执行,直到触发回调:
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) {
// ...
}