Как вернуть ArrayList из сопрограммы? - PullRequest
1 голос
/ 03 октября 2019

Как вернуть 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 в строкеfun Continuation.resume (значение: T): Единица Нет Получатель следующих замен: Продолжение? / * = java.util.ArrayList? * /> аргументы: (kotlin.collections.ArrayList? / * = java.util.ArrayList? * /)

1 Ответ

3 голосов
/ 03 октября 2019

Я полагаю, WebApi.ReadingsList - это функция без приостановки. Это означает, что вам нужно будет заставить поток ждать, пока он работает. Вы, вероятно, не хотите использовать Dispatchers.Main для этого, так как это запустит его в потоке пользовательского интерфейса. 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
}

Это запустит блокирующий вызов в подчиненном задании в потоке ввода-вывода. Это гарантирует, что если ваша сопрограмма будет отменена, то подчиненное задание также будет отменено - хотя это не прервет блокирующий вызов.

...