首页 > 解决方案 > 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 还是来自模拟器?

标签: androidapikotlin

解决方案


免责声明:我是通过以下请求转介到这篇文章的。

这是当您以 Android 9.0 为目标时面临的一个问题,并且正如@Torben Kohlmeier提到的那样,因为该字段不再可访问。

您可以将模块中的 khttp 实现替换build.gradle为以下内容,这应该可以按预期工作。

implementation "io.karn:khttp-android:0.1.0"

khttp-android是 jkcclemens 原始khttp 库的一个分支。


推荐阅读