我正在开发一个android项目,我计划用OKHTTP客户端替换Apache httpclient实现.我想知道如何创建一个全局客户端,可以用于将使用客户端多线程的不同活动和服务中的网络请求.我应该创建一个OKHTTPClient的单例对象并在我的代码中重用它吗?
此外,我应该在哪里将cookiestore添加到请求中,在客户端的全局定义中,以便我所有请求都可以使用cookie或在个人活动或服务中形成请求?
我想使用OkHttpClient加载网址,如果给定网址的网站以pdf内容类型响应,我将继续下载PDF,否则我想忽略响应.
我的问题是,我是否需要做一些特殊的事情来关闭请求/响应,或者如果我选择不读取响应字节流,我是否需要做任何事情来表明我不会使用响应?如果没有,OkHttpClient何时关闭连接?
我正在尝试使用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) 我正在使用Retrofit 2-beta2和OkHttp 2.7.0.
为了OkHttpClient从Retrofit 获取对象,我正在使用Retrofit .client()方法并取消所有正在运行的请求,我称之为取消(Object tag)方法,但请求仍然继续运行,我得到了响应.
即使客户Dispatcher的getQueuedCallCount()和getRunningCallCount()返回0调用cancel()之后.
还有什么我需要做的才能工作吗?或者它可能是OkHttp中的错误?
作为一种解决方法,我打电话shutdownNow()给客户,ExecutorService 但我更喜欢更清洁的解决方案.
这两个库有什么区别?
我怎么理解这两个lib之间也有区别,因为Volley使用httpurlconnection和Retrofit okhttp ....
但我不明白它们之间的区别以及两种解决方案的利弊.什么时候okhttp更好,什么时候httpurlconnection?
我想知道所以我知道我什么时候应该使用它们.
编辑:
为什么android使用okhttp进行httpurlconnection?如果我没有错,httpurlconnection没有使用okhttp之前
为了发出 http 请求,JAVA 中有一些 API 替代,例如 Apache HttpClient 和 Okhttp。Apache HttpClient 已经成熟且应用广泛,Okhttp 似乎越来越流行(我不确定)。
我想知道的是,哪个更好,或者 Apache HttpClient 是否具有 Okhttp 没有的某些功能,或者相反?大多数情况下,我在服务器端谈论,谈论在 Android 应用程序中使用也很好。
我希望可以列出一些要点,因此我可以弄清楚Apache HttpClient和Okhttp之间的区别。
参考:
URLConnection 和 HttpClient 之间存在一个问题: URLConnection 或 HTTPClient :哪个提供更好的功能和更高的效率?
所以我正在尝试将新的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) 当我的 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]
这些是我测试过的环境:
在此您有堆栈跟踪:
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) 由于连接超时问题,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) 我有一个正在生产中的应用程序,每天有数千名用户使用。
我使用的是 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 中,我每天都会收到数千份报告,称存在一些错误。在讨论这些错误之前,我想向您保证用户已使用适当的网络权限连接到互联网。我看到用户当时正在打开其他内容的日志。所以这些错误看起来确实是随机的。
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)