Luchando con las corrutinas, pero ¿hay una mejor manera de usar/obtener el valor de una llamada de larga duración aquí antes de pasarla a otra corrutina de red con la devolución de llamada? He visto otros, pero parece que no puedo usar el valor con la última versión de coroutine de droides, como si no pudiera hacer que esto funcione Kotlin Coroutines con valor de retorno
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 } } }Dónde se utiliza el valor en última instancia
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 ( } }Gracias por cualquier ayuda
editar: creo que en realidad estaba buscando era un poco diferente con
suspend fun launchGeneratePayload(): String? = withContext(Dispatchers.Default) { try { slowStringGeneration() //slow } catch (e: java.lang.Exception) { null } } }Se agregará como respuesta más adelante en caso de que todavía esté fuera de esto/otro.
Puede usar el generador de rutinas de launch para iniciar la rutina:
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 } } Nota: también puede hacer networkCall() como suspend , luego no necesitará usar callback .
Para usar Dispatchers.Main en Android, agregue dependencia al archivo build.gradle de la aplicación
implementación 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1'