-2

在我的 Android 应用程序中,我使用AppAuth通过 OpenID 连接端点对用户进行身份验证,所以我正在执行一堆异步调用,当最后一个调用返回时,我使用 okhttp 来获得最终结果,我想要在我的活动的 UI 中显示它,如下所示:

authService.performTokenRequest(
    authResponse.createTokenExchangeRequest()
) { tokenResponse: TokenResponse?, tokenException: AuthorizationException? ->
    if (tokenResponse != null) {                         
        authState.performActionWithFreshTokens(authService) { accessToken, _, ex ->
            if (accessToken != null) {
                val url = ...
                val request = ...
                http.newCall(request).enqueue(object: Callback {
                    override fun onFailure(call: Call?, e: IOException?) {...}
                    override fun onResponse(call: Call?, response: Response?) {
                        if (response != null) {
                            this@MainActivity.runOnUiThread {
                                textView.text = response.body()!!.string()
                            }
                        }
                    }
                })
            }
        }
    }
}

但是当我尝试更新我的文本视图时,我得到了以下异常:

android.os.NetworkOnMainThreadException

当我尝试删除 时runOnUiThread,我得到另一个异常,上面写着:“只有创建视图层次结构的原始线程才能触及它的视图”

我不明白。我该怎么办?

4

1 回答 1

3

这应该有效:

override fun onResponse(call: Call?, response: Response?) {                           
    val body = response?.body()?.string()
    this@MainActivity.runOnUiThread { textView.text = body }              
}

您不应访问responseUI 线程上的 ,因为它被视为 IO 操作。

于 2018-04-10T17:23:44.963 回答