問題

如何從Coroutine返回ArrayList?

     GlobalScope.launch {
       val list = retrieveData(firstDateOfMonth,lastDateOfMonth)
      }

 suspend fun retrieveData(
        first: Date,
        last: Date,
 ): ArrayList<Readings> = suspendCoroutine { c ->

        var sensorReadingsList : ArrayList<Readings>?=null

        GlobalScope.launch(Dispatchers.Main) {
            val task2 = async {
                WebApi.ReadingsList(
                    activity,auth_token, first, last
                )
            }
            val resp2 = task2.await()

            if (resp2?.status == "Success") {
                 sensorReadingsList = resp2?.organization_sensor_readings
            }

            c.resume(sensorReadingsList)
        }
    }
 

錯誤

型別推斷失敗:無法推斷型別引數T在內聯有趣 javascript – Continuation.secure(value:T):Unit None以下 替換接收器: 繼續?>引數: (kotlin.collections.ArrayList?)

  最佳答案

我想WebApi.ReadingsList是一個非暫停函式.這意味著您需要在執行時進行執行緒等待.您可能不想為此使用Dispatchers.Main,因為這將在UI執行緒上執行它.Dispatchers.IO將是正常的選擇.

您也真的不應該為此呼叫suspendCoroutine.這意味著與其他型別的非同步回撥進行低級別的互動,在這種情況下您沒有.這樣的東西更合適:

 suspend fun retrieveData(
        first: Date,
        last: Date,
 ): ArrayList<Readings>? = coroutineScope {
    val resp2 = async(Dispatchers.IO) {
            WebApi.ReadingsList(activity,auth_token, first, last)
        }.await()
    if (resp2?.status == "Success") {
        resp2?.organization_sensor_readings
    } else {
        null
    }
}
 

這將在IO執行緒上的下屬作業中執行阻塞呼叫.這確保如果取消了coroutine,那麼下屬作業也將被取消 – 儘管這不會打斷阻塞呼叫.

  相同標籤的其他問題

androidkotlincoroutinekotlin-coroutines