私の 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
、「ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます」という別の例外が発生します。
理解できません。私は何をすべきか?