Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
413 views
in Technique[技术] by (71.8m points)

kotlin - Suspend a call until a value is set

I want class UploadWorker to retrieve a value from class Manager, but that value may not yet be ready in Manager. So I want class UploadWorker to wait until that value is set.

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 
      }    
}

In the else if I could somehow suspend or wait until my MyApplication class calls initialize(). Any ideas?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

CompletableDeferred is quite handy for situations like this.

Your code would probably look something like this:

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
    }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...