Kotlin 从SDK内部的协程返回值(不阻塞主线程)
我正在将SDK移植到Kotlin,它基本上是一些网络调用的包装器。现有的Java版本使用回调将结果返回给开发人员。据我所知,协同程序似乎是实现这一点的一种合理方法,但我正在努力解决如何在不阻塞主线程的情况下返回结果的问题 这是我的密码: MainActivity.javaKotlin 从SDK内部的协程返回值(不阻塞主线程),kotlin,kotlin-coroutines,Kotlin,Kotlin Coroutines,我正在将SDK移植到Kotlin,它基本上是一些网络调用的包装器。现有的Java版本使用回调将结果返回给开发人员。据我所知,协同程序似乎是实现这一点的一种合理方法,但我正在努力解决如何在不阻塞主线程的情况下返回结果的问题 这是我的密码: MainActivity.java public void onClickButton(View v) { OiSDK oiSDK = new OiSDK(new NetworkHandler()); List<Token> tok
public void onClickButton(View v) {
OiSDK oiSDK = new OiSDK(new NetworkHandler());
List<Token> tokens = oiSDK.getTokens();
}
两个问题:
runBlocking
阻塞主线程(如多个地方所述,包括文档)CoroutineScope(Dispatchers.IO).launch
)将为网络调用使用工作线程,但getTokens
仍会阻止主线程启动
,我不知道如何返回结果协同路由是否真的适合这个用例,因为我不只是想更新一些UI,而是需要返回SDK范围之外的东西?如果是:如何实现这一点?为了避免阻塞,调用者必须已经在协同路由中。你不能使
有趣的getTokens:List
不阻止线程。要避免阻止,调用方必须已经在一个协同程序中。你不能使有趣的getTokens:List
不阻塞线程。
fun getTokens() = runBlocking {
Log.d("OiSDK", "getTokens - from thread ${Thread.currentThread().name}")
val tokens = async { fetchTokensFromServer() }.await()
tokens
}
suspend fun fetchTokensFromServer(): List<Token> {
val startTime = System.currentTimeMillis()
Log.d("OiSDK", "fetchTokensFromServer - from thread ${Thread.currentThread().name}")
var tokens = ArrayList<Token>()
val response = networkHandler.networkAPI.authorize(registrationUri,
authorizationHeader, Constants.TOKEN_GRANT_TYPE_AUTHORIZATION_CODE,
code, redirectUrl)
tokens.add(new Token(response))
val endTime = System.currentTimeMillis()
Log.d("OiSDK", "Time taken: ${endTime - startTime}")
return tokens
}
2020-03-08 22:18:24.741 11740-11740/D/MainActivity: Update progessBar 14 - from thread main
2020-03-08 22:18:24.844 11740-11740/D/MainActivity: Update progessBar 15 - from thread main
2020-03-08 22:18:24.945 11740-11740/D/MainActivity: Update progessBar 16 - from thread main
2020-03-08 22:18:25.143 11740-11740/D/OiSDK: getTokens - from thread main
2020-03-08 22:18:25.150 11740-11818/D/OiSDK: fetchTokensFromServer - from thread main
2020-03-08 22:18:28.202 11740-11740/D/OiSDK: Time taken: 3058
2020-03-08 22:18:28.217 11740-11740/D/MainActivity: Update progessBar 17 - from thread main
2020-03-08 22:18:28.228 11740-11740/D/MainActivity: Update progessBar 18 - from thread main
2020-03-08 22:18:28.320 11740-11740/D/MainActivity: Update progessBar 19 - from thread main