Kotlin 在设置值之前挂起调用

Kotlin 在设置值之前挂起调用,kotlin,kotlin-coroutines,Kotlin,Kotlin Coroutines,我希望classUploadWorker从classManager中检索一个值,但该值可能尚未在Manager中准备好。所以我希望classUploadWorker等待该值被设置 class UploadWorker(appContext: Context, workerParams: WorkerParameters): Worker(appContext, workerParams) { override fun doWork(): Result { Ma

我希望class
UploadWorker
从class
Manager
中检索一个值,但该值可能尚未在
Manager
中准备好。所以我希望class
UploadWorker
等待该值被设置

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){
...
已初始化。完成(单位)
}
暂停(已初始化){
已初始化。等待()
//此时将完成初始化
}
}