如何从ArrayList
返回Coroutine
?
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 Continuation.resume(value:T):单位下列内容均不 替补接收人: 继续吗? / * = java.util.ArrayList? * />参数: (kotlin.collections.ArrayList?/ * = java.util.ArrayList? * /)
答案 0 :(得分:3)
我想WebApi.ReadingsList
是一个非暂停功能。这意味着您需要在线程运行时使其等待。您可能不想使用Dispatchers.Main
,因为那样会在UI线程上运行它。 Dispatchers.IO
是正常选择。
您也不应该为此致电suspendCoroutine
。这意味着与其他类型的异步回调进行低级互操作,在这种情况下您没有此功能。这样的事情会更合适:
suspend fun retrieveData(
first: Date,
last: Date,
): ArrayList<Readings>? {
val resp2 = withContext(Dispatchers.IO) {
WebApi.ReadingsList(activity,auth_token, first, last)
}
if (resp2?.status == "Success") {
return resp2?.organization_sensor_readings
}
return null
}
这将在IO线程的下级作业中运行阻塞调用。这样可以确保,如果您的协同程序被取消,那么下级作业也将被取消-尽管这不会中断阻塞调用。