gpt4 book ai didi

android - 来自 okhttp3.internal.Util.closeQuietly() 的 IncompatibleClassChangeError

转载 作者:搜寻专家 更新时间:2023-11-01 08:29:46 25 4
gpt4 key购买 nike

在旧版本的 Android(4.3 及更早版本)上看到以下堆栈:

Caused by: java.lang.IncompatibleClassChangeError: interface not implemented
at okhttp3.internal.Util.closeQuietly(Util.java:100)
at okhttp3.internal.connection.StreamAllocation.streamFailed(StreamAllocation.java:332)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.recover(RetryAndFollowUpInterceptor.java:209)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:132)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:212)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:179)
at okhttp3.RealCall.execute(RealCall.java:63)

这似乎表明 okhttp 和 Java 6 之间存在不兼容性,其中 java.net.Socket 没有实现 Closeable

问题似乎主要是由于流失败造成的。在我们开始调用此 php 页面(从 https://stackoverflow.com/a/141026/315702 借用)之前很难重现,这会在客户端强制导致流失败:

<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(true); // just to be safe
ob_start();
echo('Text the user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush(); // Strange behaviour, will not work
flush(); // Unless both are called !
sleep(30);
echo('Text user will never see');
?>

最佳答案

这似乎是当前 okhttp 3.6.0-SNAPSHOT 构建的错误。我提交了 bug report在 okhttp github 站点上。当连接意外关闭时抛出异常。 [更新:通过将 Closeable 替换为 Socket 以向后兼容此 pull request 中的 Java 6,很快修复了该错误。 .]

在我们的案例中,问题的真正核心是我们一开始就不想使用 okhttp 3.6.0-SNAPSHOT。在我们的 build.gradle 中,我们指定了 3.4.1。事实证明,我们的第三方库之一依赖于 okhttp:+,这是我们通过以下 gradle 命令发现的:

./gradlew -q :app:dependencyInsight --dependency okhttp --configuration compile

因此,我们引入了最新版本的 okhttp。在我们的案例中,罪魁祸首是 exoplayer 的 okhttp 扩展。通过排除对 okhttp:+ 的不需要的模块依赖,我们能够避免加载 3.6.0-SNAPSHOT:

compile('com.google.android.exoplayer:extension-okhttp:r2.0.4') {
exclude module: 'okhttp'
}

关于android - 来自 okhttp3.internal.Util.closeQuietly() 的 IncompatibleClassChangeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41771505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com