Android kotlin сопрограммы, есть ли лучший способ вернуть это значение?
Борьба с сопрограммами, но есть ли лучший способ использовать / получить значение для продолжительного вызова здесь, прежде чем передать его в другую сетевую подпрограмму с обратным вызовом? Я видел других, но я не могу использовать значение в последнем выпуске дроида-сопрограммы, как будто я не могу заставить эту работу работать с 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 (
}
}
Спасибо за любую помощь
редактировать: я думаю, что на самом деле искал было немного по-другому с
suspend fun launchGeneratePayload(): String? =
withContext(Dispatchers.Default) {
try {
slowStringGeneration() //slow
} catch (e: java.lang.Exception) {
null
}
}
}
Позже добавлю в качестве ответа, если я все еще на этом / другом.
1 ответ
Ты можешь использовать 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'