Сопрограммы Kotlin, есть ли лучший способ вернуть это значение? - PullRequest
0 голосов
/ 28 февраля 2019

Борьба с сопрограммами, но есть ли лучший способ использовать / получить значение для продолжительного вызова здесь, прежде чем передать его в другую сетевую подпрограмму с обратным вызовом?Я видел других, но я не могу использовать это значение в последнем выпуске дроида-сопрограммы, как будто я не могу заставить это работать Kotlin Coroutines с возвращаемым значением

private suspend fun launchGeneratePayload(): String? { 
    return withContext (Dispatchers.Default) {
        try {
            val payloadString = slowStringGeneration()//Slow
            return@withContext payloadString
        } catch (e: java.lang.Exception) {
            return@withContext null
        }
    }
}

Где в конечном итоге используется значение

public someFunction(callback: CallBack) {      
    val params: JSONObject = JSONObject()
    params.put("param1", "param1Value")
    runBlocking{ //probably should be launch or similar
        val payload = launchGeneratePayload()
        params.put("param2", payload)
        //call network function with params & callback
        //networkCall (
    } 
}

Спасибо за любую помощь

edit: Я думаю, что на самом деле искал немного другое с

suspend fun launchGeneratePayload(): String? =
    withContext(Dispatchers.Default) {
        try {
            slowStringGeneration() //slow
        } catch (e: java.lang.Exception) {
             null
        }
    }
}

Позже добавлю в качестве ответа, если я еще не включился в это / еще.

1 Ответ

0 голосов
/ 28 февраля 2019

Вы можете использовать launch конструктор сопрограмм для запуска сопрограммы:

private var job: Job = Job()
private var scope = CoroutineScope(Dispatchers.Main + job)

fun someFunction(callback: CallBack) {
    val params: JSONObject = JSONObject()
    params.put("param1", "param1Value")
    scope.launch { // launch the coroutine
        val payload = generatePayload() // generate String without blocking the main thread
        params.put("param2", payload)
        //call network function with params & callback
        //networkCall (params, callback)
    }
}

suspend fun generatePayload(): String? = withContext(Dispatchers.Default) {
    try {
        slowStringGeneration() //slow
    } catch (e: java.lang.Exception) {
        null
    } 
}

Примечание: вы также можете сделать networkCall() как приостановить , тогда вам не нужно будетиспользуйте callback.

Чтобы использовать Dispatchers.Main в Android, добавьте зависимость в файл build.gradle приложения

реализация 'org.jetbrains.kotlinx: kotlinx-coroutines-android:1.0.1 '

...