问题

如何从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