android - Ljava/net/URL 类中没有字段主机
问题描述
当我尝试khttp
使用 SDK 28(Android Pie 9.0)在 Android Studio 上的模拟器中请求 API 时,我遇到了这个问题
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: com.example.corentin.myapplication, PID: 3168
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:354)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
Caused by: java.lang.NoSuchFieldException: No field host in class Ljava/net/URL; (declaration of 'java.net.URL' appears in /system/framework/core-oj.jar)
at java.lang.Class.getDeclaredField(Native Method)
at khttp.requests.GenericRequest.toIDN(GenericRequest.kt:193)
at khttp.requests.GenericRequest.makeRoute(GenericRequest.kt:198)
at khttp.requests.GenericRequest.<init>(GenericRequest.kt:128)
at khttp.KHttp.request(KHttp.kt:58)
at khttp.KHttp.get(KHttp.kt:28)
at khttp.KHttp.get$default(KHttp.kt:27)
at com.example.corentin.myapplication.InfoUser.run(InfoUser.kt:29)
at com.example.corentin.myapplication.InfoUser$onCreate$1.invoke(InfoUser.kt:23)
at com.example.corentin.myapplication.InfoUser$onCreate$1.invoke(InfoUser.kt:16)
at com.example.corentin.myapplication.doAsync.doInBackground(InfoUser.kt:11)
at com.example.corentin.myapplication.doAsync.doInBackground(InfoUser.kt:9)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
这就是错误的来源:
class doAsync(val handler: () -> Unit) : AsyncTask<Void, Void, Void>() {
override fun doInBackground(vararg params: Void?): Void? {
handler()
return null
}
}
class InfoUser : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_info_user)
doAsync {
run("https://api.imgur.com/3/account/xcoco55?client_id=CLIENT ID")
}.execute()
}
fun run(url: String) {
val response = khttp.get(url)
println("Coucou")
if (response.statusCode == 200) {
runOnUiThread {textView.text = response.text}
}
}
}
当我删除该行时val response = khttp.get(url)
,或者当我在手机(Android Oreo 8.1)上启动应用程序时,一切正常。
您认为错误来自 Android 9.0 还是来自模拟器?
解决方案
免责声明:我是通过以下请求转介到这篇文章的。
这是当您以 Android 9.0 为目标时面临的一个问题,并且正如@Torben Kohlmeier提到的那样,因为该字段不再可访问。
您可以将模块中的 khttp 实现替换build.gradle
为以下内容,这应该可以按预期工作。
implementation "io.karn:khttp-android:0.1.0"
该khttp-android
库是 jkcclemens 原始khttp 库的一个分支。
推荐阅读
- python - python multiprocessing - 在复杂的数据结构上使用 Pool.map
- java - jsonb 数组的构建标准
- python - 有没有办法在发推文时使用 Arduino 作为 Twitter 通知
- excel - Excel 空闲超时,并带有一个定时消息框警告在设定的时间内保存和关闭
- javascript - 如何在 Sequelize 中对 paraloid 进行级联删除?
- adobe - 无法从 pdfium 中的 abobe pdf 获取突出显示颜色
- casting - 将浮点数转换为短并返回浮点数
- javascript - 在范围选择器中更改时间格式
- python-3.x - 如何更改熊猫中的列名
- javascript - 如何用对象嵌套值替换字符串