簡體   English   中英

暫停正在運行的協程

[英]Suspend a running Coroutine

我可以通過在協程內部調用suspendCoroutine<String> { cont -> continuation = cont }來掛起協程,但是如何從協程外部掛起它並讓后續繼續恢復它?

編輯:

The job of coroutine is to receive json messages from server using jackson streaming api and store them using sqlite and also notify activities of new message if callbacks are not null (activities are running)

現在,當服務(包含協程)已經在運行並更新數據庫時,如果活動連接到它,我希望活動首先從數據庫中獲取所有消息,然后繼續從服務接收新消息。

問題:

  • 如果我讓協程在活動從數據庫同步消息時運行,新消息可能無法完全/正確同步或最終在舊消息中間,原因我希望協程暫停直到同步完成。

  • 在 jackson 開始等待新消息之前,我無法檢查是否應該暫停協程,它會很快通過這個條件。

  • jackson 正在等待來自網絡的新消息(讀取時被阻止)時,我無法檢查是否應該暫停協程,這是無法完成的。

  • 在 jackson 收到消息后,我無法檢查是否應該暫停協程,因為那時我將不得不等待新消息開始同步。

編輯2:

我認為最好的解決方案是開始同步並添加一個檢查活動是否已經在接收到數據之后以及在進行任何回調或將數據存儲到數據庫之前進行同步,這樣,協程可以自由地阻塞讀取而不插入新數據,直到活動完成同步。

我假設您正在打開兩個不同的協程而不是一個,這使您可以 0 控制哪個協程首先運行:

你可以在一個協程中完成所有工作,它的執行就像命令式編程一樣:

someScope.launch(someDispatcher){
  val dataFromDb = fethDbData()
  if(dataFromDb.size == expectedSizeOrSomething){
     //start api call
     val apiResponse = response.fetchNetworkData()
     if (response.isSuccessful){
       parsePerhaps()
       insertNewDataToDatabase()
      }
   }
}

根據您的描述,應該是這樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM