Kotlin 在设置值之前挂起调用
我希望classKotlin 在设置值之前挂起调用,kotlin,kotlin-coroutines,Kotlin,Kotlin Coroutines,我希望classUploadWorker从classManager中检索一个值,但该值可能尚未在Manager中准备好。所以我希望classUploadWorker等待该值被设置 class UploadWorker(appContext: Context, workerParams: WorkerParameters): Worker(appContext, workerParams) { override fun doWork(): Result { Ma
UploadWorker
从classManager
中检索一个值,但该值可能尚未在Manager
中准备好。所以我希望classUploadWorker
等待该值被设置
class UploadWorker(appContext: Context, workerParams: WorkerParameters):
Worker(appContext, workerParams) {
override fun doWork(): Result {
Manager.isReady()
return Result.success()
}
}
object Manager {
private lateinit var isReady
fun initialize(context: Context, myData: MyData) {
...
isReady = true
}
suspend fun isReady() {
if(::isReady.isInitialized()
return isReady
else // wait here until initialized
}
}
如果我能以某种方式
挂起
或等待我的MyApplication
类调用initialize()
,则在else中。有什么想法吗?您可以使用StateFlow
传递初始化状态:
val isReady=MutableStateFlow(false)
//等待:
如果(isReady.value)返回true
else isReady.first{it}//it==true
//通知:
isReady.value=true
虽然StateFlows非常轻量级,但是如果您想以一种丑陋的方式(直接使用协程内部构件)更轻量级地实现它:
val conts=mutableListOf()
私有lateinit变量isReady=false
设置(值){
if(value)conts.forEach{it.resume(true)}
字段=值
}
//等待:
如果(isReady)返回true
else SuspendCancelableCoroutine{cont->
续添加(续)
调用取消{conts.remove(cont)}
}
//通知:
isReady=true
您可以使用StateFlow
传递初始化状态:
val isReady=MutableStateFlow(false)
//等待:
如果(isReady.value)返回true
else isReady.first{it}//it==true
//通知:
isReady.value=true
虽然StateFlows非常轻量级,但是如果您想以一种丑陋的方式(直接使用协程内部构件)更轻量级地实现它:
val conts=mutableListOf()
私有lateinit变量isReady=false
设置(值){
if(value)conts.forEach{it.resume(true)}
字段=值
}
//等待:
如果(isReady)返回true
else SuspendCancelableCoroutine{cont->
续添加(续)
调用取消{conts.remove(cont)}
}
//通知:
isReady=true
CompletableDeferred
在这种情况下非常方便
您的代码可能如下所示:
object Manager {
private val initialized = CompletableDeferred<Unit>()
fun initialize(context: Context, myData: MyData) {
...
initialized.complete(Unit)
}
suspend fun awaitInitialized() {
initialized.await()
// initialization is done at this point
}
}
对象管理器{
private val initialized=CompletableDeferred()
趣味初始化(上下文:上下文,myData:myData){
...
已初始化。完成(单位)
}
暂停(已初始化){
已初始化。等待()
//此时将完成初始化
}
}
CompletableDeferred
在这种情况下非常方便
您的代码可能如下所示:
object Manager {
private val initialized = CompletableDeferred<Unit>()
fun initialize(context: Context, myData: MyData) {
...
initialized.complete(Unit)
}
suspend fun awaitInitialized() {
initialized.await()
// initialization is done at this point
}
}
对象管理器{
private val initialized=CompletableDeferred()
趣味初始化(上下文:上下文,myData:myData){
...
已初始化。完成(单位)
}
暂停(已初始化){
已初始化。等待()
//此时将完成初始化
}
}