如何从协程返回ArrayList?

时间:2019-10-03 03:55:42

标签: android kotlin coroutine kotlin-coroutines

如何从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? * /)

1 个答案:

答案 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线程的下级作业中运行阻塞调用。这样可以确保,如果您的协同程序被取消,那么下级作业也将被取消-尽管这不会中断阻塞调用。