Kotlin 协程,有没有更好的方法来 return 这个值?
Kotlin coroutines, is there a better way to return this value?
与协程作斗争,但是有没有更好的方法来 use/get 长 运行 的值,然后将其传递到另一个网络协程与回调?我见过其他人,但我似乎无法使用最新的 droid 协程版本的值,就像我似乎无法完成这项工作
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
}
}
}
如果我还在this/else。
,稍后会添加为答案
您可以使用 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()
设为suspend,这样就不需要使用callback
.
要在 Android 中使用 Dispatchers.Main
,请将依赖项添加到应用程序的 build.gradle 文件
implementation
'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1'
与协程作斗争,但是有没有更好的方法来 use/get 长 运行 的值,然后将其传递到另一个网络协程与回调?我见过其他人,但我似乎无法使用最新的 droid 协程版本的值,就像我似乎无法完成这项工作
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
}
}
}
如果我还在this/else。
,稍后会添加为答案您可以使用 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()
设为suspend,这样就不需要使用callback
.
要在 Android 中使用 Dispatchers.Main
,请将依赖项添加到应用程序的 build.gradle 文件
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1'