标签: okhttp

Android使用OKHTTP单例进行并行查询的正确方法

我正在开发一个android项目,我计划用OKHTTP客户端替换Apache httpclient实现.我想知道如何创建一个全局客户端,可以用于将使用客户端多线程的不同活动和服务中的网络请求.我应该创建一个OKHTTPClient的单例对象并在我的代码中重用它吗?

此外,我应该在哪里将cookiestore添加到请求中,在客户端的全局定义中,以便我所有请求都可以使用cookie或在个人活动或服务中形成请求?

cookies android android-networking okhttp

11
推荐指数
1
解决办法
6939
查看次数

OkHttpClient关闭连接

我想使用OkHttpClient加载网址,如果给定网址的网站以pdf内容类型响应,我将继续下载PDF,否则我想忽略响应.

我的问题是,我是否需要做一些特殊的事情来关闭请求/响应,或者如果我选择不读取响应字节流,我是否需要做任何事情来表明我不会使用响应?如果没有,OkHttpClient何时关闭连接?

java android okhttp

11
推荐指数
1
解决办法
2万
查看次数

OkHTTP从enqueue回调更新UI

我正在尝试使用OkHTTP库.调用服务器并获得成功响应时.我需要更新UI.

使用enqueue()进行异步调用时如何才能完成?

client.newCall(request).enqueue(new Callback() {

    @Override
    public void onFailure(Request request, IOException e) {

    }

    @Override
    public void onResponse(Response response) throws IOException {

        if (response.isSuccessful()) {

            // NEED TO UPDATE UI HERE

        } 
    }
});
Run Code Online (Sandbox Code Playgroud)

android okhttp

11
推荐指数
3
解决办法
1万
查看次数

Retrofit 2/OkHttp:取消所有正在运行的请求

我正在使用Retrofit 2-beta2和OkHttp 2.7.0.

为了OkHttpClient从Retrofit 获取对象,我正在使用Retrofit .client()方法并取消所有正在运行的请求,我称之为取消(Object tag)方法,但请求仍然继续运行,我得到了响应.

即使客户DispatchergetQueuedCallCount()getRunningCallCount()返回0调用cancel()之后.

还有什么我需要做的才能工作吗?或者它可能是OkHttp中的错误?

作为一种解决方法,我打电话shutdownNow()给客户,ExecutorService 但我更喜欢更清洁的解决方案.

java android retrofit okhttp

11
推荐指数
1
解决办法
1万
查看次数

okhttp和httpurlconnection之间的区别?

这两个库有什么区别?

我怎么理解这两个lib之间也有区别,因为Volley使用httpurlconnection和Retrofit okhttp ....

但我不明白它们之间的区别以及两种解决方案的利弊.什么时候okhttp更好,什么时候httpurlconnection?

我想知道所以我知道我什么时候应该使用它们.

编辑:

为什么android使用okhttp进行httpurlconnection?如果我没有错,httpurlconnection没有使用okhttp之前

android httpurlconnection okhttp

11
推荐指数
3
解决办法
7788
查看次数

Okhttp 或 HTTPClient :哪个提供更好的功能和更高的效率?

为了发出 http 请求,JAVA 中有一些 API 替代,例如 Apache HttpClient 和 Okhttp。Apache HttpClient 已经成熟且应用广泛,Okhttp 似乎越来越流行(我不确定)。

我想知道的是,哪个更好,或者 Apache HttpClient 是否具有 Okhttp 没有的某些功能,或者相反?大多数情况下,我在服务器端谈论,谈论在 Android 应用程序中使用也很好。

我希望可以列出一些要点,因此我可以弄清楚Apache HttpClient和Okhttp之间的区别。

参考:

URLConnection 和 HttpClient 之间存在一个问题: URLConnection 或 HTTPClient :哪个提供更好的功能和更高的效率?

java httpclient okhttp

11
推荐指数
1
解决办法
1万
查看次数

无法使用Firebase应用内消息传递?

所以我正在尝试将新的Firebase应用程序内消息传递功能实现到我的Android应用程序中.但出于任何原因,应用程序崩溃的那一刻我将库添加到我的gradle中.

这是我的傻瓜:

implementation 'com.google.firebase:firebase-inappmessaging-display:17.0.0'
implementation 'com.squareup.picasso:picasso:2.71828'
Run Code Online (Sandbox Code Playgroud)

我在这里给了poicasso因为在崩溃日志中我得到了与毕加索有关的错误

这是日志文件:

08-19 18:10:08.482 26606-26606/com.kirtu.simpletexts.texts.debug E/CrashlyticsCore: Failed to execute task.
    java.util.concurrent.TimeoutException
        at java.util.concurrent.FutureTask.get(FutureTask.java:177)
        at com.crashlytics.android.core.CrashlyticsBackgroundWorker.submitAndWait(CrashlyticsBackgroundWorker.java:41)
        at com.crashlytics.android.core.CrashlyticsController.handleUncaughtException(CrashlyticsController.java:320)
        at com.crashlytics.android.core.CrashlyticsController$6.onUncaughtException(CrashlyticsController.java:300)
        at com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler.uncaughtException(CrashlyticsUncaughtExceptionHandler.java:42)
        at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1068)
        at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1063)
08-19 18:10:08.484 26606-26606/com.kirtu.simpletexts.texts.debug E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.kirtu.simpletexts.texts.debug, PID: 26606
    java.lang.NoClassDefFoundError: Failed resolution of: Lcom/squareup/picasso/OkHttpDownloader;
        at com.google.firebase.inappmessaging.display.internal.b.b.zzr.get(com.google.firebase:firebase-inappmessaging-display@@17.0.0:2038)
        at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
        at com.google.firebase.inappmessaging.display.internal.zzf.get(com.google.firebase:firebase-inappmessaging-display@@17.0.0:1021)
        at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
        at com.google.firebase.inappmessaging.display.zzb.get(com.google.firebase:firebase-inappmessaging-display@@17.0.0:1062)
        at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
        at com.google.firebase.inappmessaging.display.internal.b.a.zzb.zza(com.google.firebase:firebase-inappmessaging-display@@17.0.0:104)
        at com.google.firebase.inappmessaging.display.FirebaseInAppMessagingDisplayRegistrar.zza(com.google.firebase:firebase-inappmessaging-display@@17.0.0:1058)
        at com.google.firebase.inappmessaging.display.zza.create(com.google.firebase:firebase-inappmessaging-display@@17.0.0)
        at com.google.firebase.components.zzh.zza(com.google.firebase:firebase-common@@16.0.1:29)
        at com.google.firebase.components.zzi.get(com.google.firebase:firebase-common@@16.0.1)
        at com.google.firebase.components.zzh.get(com.google.firebase:firebase-common@@16.0.1:40)
        at com.google.firebase.components.ComponentContainer$$CC.get(com.google.firebase:firebase-common@@16.0.1:15)
        at com.google.firebase.components.zzd.get(com.google.firebase:firebase-common@@16.0.1)
        at com.google.firebase.components.zzd.zza(com.google.firebase:firebase-common@@16.0.1:68)
        at com.google.firebase.FirebaseApp.zze(com.google.firebase:firebase-common@@16.0.1:716)
        at …
Run Code Online (Sandbox Code Playgroud)

android firebase picasso okhttp firebase-in-app-messaging

11
推荐指数
1
解决办法
1631
查看次数

Java 11 上的 SocketTimeout 而不是 Java 8

当我的 Java 程序与 Java 8 和 Java 11 一起运行时,我有一个非常奇怪的行为差异。

我正在使用 MSGraph API (1.7.0) 对 Onedrive API 进行多次调用。为了进行这些调用,我使用了 4 个并行线程来同步硬盘上的大量文件(大约 1000 个)。

当我使用 Java 8 执行程序时,我没有发现任何异常。当我使用 java 11 执行它时,我在大约 60% 的调用中收到了 Socket Timeout Exception。

要配置IGraphServiceClient,我使用的是默认配置。就我而言,在这种情况下,HTTP 提供程序是 OKHttp3。

有没有人经历过这样的事情?

[更新-1]

这些是我测试过的环境:

  • Oracle 的 JDK 1.8.0_192 --> 完美。在大约 400 次调用中没有错误
  • Openjdk 11.0.7 和 Oracle 的 jdk 11.0.3 --> 大量的 Sokcet 超时异常

在此您有堆栈跟踪:

com.microsoft.graph.core.ClientException: Error during http request
    at com.microsoft.graph.http.CoreHttpProvider.sendRequestInternal(CoreHttpProvider.java:422) ~[easybox-0.1-SNAPSHOT.jar:?]
    at com.microsoft.graph.http.CoreHttpProvider.send(CoreHttpProvider.java:204) ~[easybox-0.1-SNAPSHOT.jar:?]
    at com.microsoft.graph.http.CoreHttpProvider.send(CoreHttpProvider.java:184) ~[easybox-0.1-SNAPSHOT.jar:?]
    at com.microsoft.graph.http.BaseStreamRequest.send(BaseStreamRequest.java:85) ~[easybox-0.1-SNAPSHOT.jar:?]
    at com.microsoft.graph.requests.extensions.DriveItemStreamRequest.get(DriveItemStreamRequest.java:55) …
Run Code Online (Sandbox Code Playgroud)

java java-8 okhttp java-11

11
推荐指数
1
解决办法
1219
查看次数

FirebaseCrashlytics:创建报告 HTTP 请求失败。okhttp3 超时

由于连接超时问题,Crashlytics 无法报告致命/非致命崩溃。

这是我的应用程序级构建 gradle

implementation 'com.google.firebase:firebase-core:17.4.4'
implementation 'com.google.firebase:firebase-crashlytics:17.1.1'
implementation 'com.google.firebase:firebase-analytics:17.4.4'
Run Code Online (Sandbox Code Playgroud)

现在崩溃没有被记录下来,每次我打开应用程序我都会得到这个,

E/FirebaseCrashlytics: Create report HTTP request failed.
    java.io.InterruptedIOException: timeout
        at okhttp3.internal.connection.Transmitter.timeoutExit(Transmitter.kt:105)
        at okhttp3.internal.connection.Transmitter.maybeReleaseConnection(Transmitter.kt:295)
        at okhttp3.internal.connection.Transmitter.noMoreExchanges(Transmitter.kt:259)
        at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.kt:202)
        at okhttp3.RealCall.execute(RealCall.kt:67)
        at com.google.firebase.crashlytics.internal.network.HttpRequest.execute(HttpRequest.java:129)
        at com.google.firebase.crashlytics.internal.report.network.DefaultCreateReportSpiCall.invoke(DefaultCreateReportSpiCall.java:90)
        at com.google.firebase.crashlytics.internal.report.network.CompositeCreateReportSpiCall.invoke(CompositeCreateReportSpiCall.java:34)
        at com.google.firebase.crashlytics.internal.report.ReportUploader.uploadReport(ReportUploader.java:116)
        at com.google.firebase.crashlytics.internal.report.ReportUploader$Worker.attemptUploadWithRetry(ReportUploader.java:194)
        at com.google.firebase.crashlytics.internal.report.ReportUploader$Worker.onRun(ReportUploader.java:149)
        at com.google.firebase.crashlytics.internal.common.BackgroundPriorityRunnable.run(BackgroundPriorityRunnable.java:27)
        at java.lang.Thread.run(Thread.java:919)
     Caused by: java.io.IOException: Canceled
        at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:65)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
        at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.kt:194)
        at okhttp3.RealCall.execute(RealCall.kt:67) 
        at com.google.firebase.crashlytics.internal.network.HttpRequest.execute(HttpRequest.java:129) 
        at com.google.firebase.crashlytics.internal.report.network.DefaultCreateReportSpiCall.invoke(DefaultCreateReportSpiCall.java:90) 
        at com.google.firebase.crashlytics.internal.report.network.CompositeCreateReportSpiCall.invoke(CompositeCreateReportSpiCall.java:34) 
        at com.google.firebase.crashlytics.internal.report.ReportUploader.uploadReport(ReportUploader.java:116) 
        at com.google.firebase.crashlytics.internal.report.ReportUploader$Worker.attemptUploadWithRetry(ReportUploader.java:194) 
        at com.google.firebase.crashlytics.internal.report.ReportUploader$Worker.onRun(ReportUploader.java:149) 
        at com.google.firebase.crashlytics.internal.common.BackgroundPriorityRunnable.run(BackgroundPriorityRunnable.java:27) 
        at java.lang.Thread.run(Thread.java:919) 
E/FirebaseCrashlytics: Error occurred sending report …
Run Code Online (Sandbox Code Playgroud)

android firebase crashlytics okhttp crashlytics-android

11
推荐指数
1
解决办法
3209
查看次数

每天报告数千个与 OkHttp 相关的问题(连接、未知主机、DNS 等)

设置

我有一个正在生产中的应用程序,每天有数千名用户使用。

我使用的是 Retrofit2 版本 2.9.0(最新)

我的build.gradle下面。

def retrofitVersion = '2.9.0'
api "com.squareup.retrofit2:converter-gson:${retrofitVersion}"
api "com.squareup.retrofit2:converter-scalars:${retrofitVersion}"
api "com.squareup.retrofit2:adapter-rxjava2:${retrofitVersion}"
api "com.squareup.retrofit2:retrofit:${retrofitVersion}"
Run Code Online (Sandbox Code Playgroud)

我集成了 Firebase Crashlytics 并使其能够在try-catch块中报告任何与 API 相关的异常。

例如

def retrofitVersion = '2.9.0'
api "com.squareup.retrofit2:converter-gson:${retrofitVersion}"
api "com.squareup.retrofit2:converter-scalars:${retrofitVersion}"
api "com.squareup.retrofit2:adapter-rxjava2:${retrofitVersion}"
api "com.squareup.retrofit2:retrofit:${retrofitVersion}"
Run Code Online (Sandbox Code Playgroud)

已知

现在,在 Crashlytics 中,我每天都会收到数千份报告,称存在一些错误。在讨论这些错误之前,我想向您保证用户已使用适当的网络权限连接到互联网。我看到用户当时正在打开其他内容的日志。所以这些错误看起来确实是随机的。

埃罗斯

  1. 未知主机异常
Non-fatal Exception: java.net.UnknownHostException: Unable to resolve host "my-host-address.com": No address associated with hostname
       at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:156)
       at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103)
       at java.net.InetAddress.getAllByName(InetAddress.java:1152)
       at okhttp3.Dns$Companion$DnsSystem.lookup(Dns.java:5)
...
Caused by android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with …
Run Code Online (Sandbox Code Playgroud)

dns android kotlin retrofit okhttp

11
推荐指数
1
解决办法
3283
查看次数