Kotlin 从SDK内部的协程返回值(不阻塞主线程)

Kotlin 从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

我正在将SDK移植到Kotlin,它基本上是一些网络调用的包装器。现有的Java版本使用回调将结果返回给开发人员。据我所知,协同程序似乎是实现这一点的一种合理方法,但我正在努力解决如何在不阻塞主线程的情况下返回结果的问题

这是我的密码:

MainActivity.java

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