Android 当块位于可运行实体内时发出流值

Android 当块位于可运行实体内时发出流值,android,kotlin-coroutines,runnable,kotlin-coroutines-flow,Android,Kotlin Coroutines,Runnable,Kotlin Coroutines Flow,所以我有这个函数,我可以用flow发出值,但我需要定期发送值,所以我使用: fun hereIsAFunction(): Flow<Type> = flow { Handler.postDelayed({ //This is in Runnable and I can't emit values emit(value) //Error 'Suspension function can only be called within Coroutin

所以我有这个函数,我可以用flow发出值,但我需要定期发送值,所以我使用:

fun hereIsAFunction(): Flow<Type> = flow {
    Handler.postDelayed({
        //This is in Runnable and I can't emit values
        emit(value) //Error 'Suspension function can only be called within Coroutine body
    }, 1000)

    usingOtherFunction()
}
Function():Flow=Flow{
Handler.postDelayed({
//这是可运行的,我不能发出值
emit(value)//Error'挂起函数只能在协同例程主体内调用
}, 1000)
使用其他函数()
}
我不想阻止函数“usingOtherFunction()”,这就是我使用runnable的原因


问题:是否有任何方法通过周期性事件的流发出值?如果是,我应该研究什么?

流构建在协同路由之上。您可以使用协程的
delay(time)
方法来延迟执行


此处有更多详细信息:

流构建在协同路由之上。您可以使用协程的
delay(time)
方法来延迟执行


这里有更多详细信息:

根据您的评论,您希望并行执行某些操作,您可以在一个范围内启动两个协同程序。它们将相互独立运行:

fun hereIsAFunction(): Flow<Type> = flow {
    coroutineScope {
        launch {
            (0..100).forEach {
                delay(1000)
                emit(...)
            }
        }
        launch {
            usingOtherFunction()
        }
    }
}
Function():Flow=Flow{
共线镜{
发射{
(0..100)forEach{
延迟(1000)
发射(…)
}
}
发射{
使用其他函数()
}
}
}

根据您的评论,您希望并行执行某些操作,您可以在一个范围内启动两个协同程序。它们将相互独立运行:

fun hereIsAFunction(): Flow<Type> = flow {
    coroutineScope {
        launch {
            (0..100).forEach {
                delay(1000)
                emit(...)
            }
        }
        launch {
            usingOtherFunction()
        }
    }
}
Function():Flow=Flow{
共线镜{
发射{
(0..100)forEach{
延迟(1000)
发射(…)
}
}
发射{
使用其他函数()
}
}
}

忘了说我不想阻止接下来的任何操作,我知道如果使用delay,我将“阻止”同一个线程,这就是为什么我使用runnableYou不能在runnable中使用emit。因为代码是在独立的线程或UI线程中执行的,这取决于looper。流是顺序的。所以你不能在流中切换线程或上下文。忘了说我不想阻止任何后续操作,我知道如果使用delay,我将“阻止”同一线程,这就是为什么我使用runnabley你不能在runnable中使用emit。因为代码是在独立的线程或UI线程中执行的,这取决于looper。流是顺序的。因此,您无法在流中切换线程或上下文。
callbackFlow
builder可能就是您要查找的内容:您希望定期发出一些内容,也可以使用其他函数()调用
作为并行方法?是的@beigirad sally callbackFlow不是我想要的,因为这是一种提供值的同步方法,而这不是我想要的
callbackFlow
builder可能是你想要的:你想周期性地发出一些东西,也可以使用其他函数()调用
作为并行方法?是的@beigirad悲哀的是callbackFlow不是我想要的,因为这是一种提供价值的同步方法,而这不是我的情况你现在真的是个大脑袋,这对我很有用!违反
流不变量时出错:检测到来自另一个协程的发射。
但我通过将
=Flow{
更改为
=channelFlow解决了此问题{
。非常感谢!PS:我犯的错误是因为我使用的是viewModelScope.launch,它正在创建另一个线程,这就是错误发生的原因,但我没有在问题中告知这一点,所以不要担心,一切都很好!你现在真的很有头脑,这对我来说很有效!关于
流不变量是一个错误违反:检测到来自另一个协程的发射。
但我通过将
=flow{
更改为
=channelFlow解决了它{
。非常感谢!PS:我所犯的错误是因为我正在使用viewModelScope.launch,它正在创建另一个线程,这就是错误发生的原因,但我没有在问题中告知这一点,所以不要担心,一切都很好!