- bounty将在6天后过期**。回答此问题可获得+200声望奖励。Saehun Sean Oh希望吸引更多人关注此问题。
设置
我有一个应用程序正在生产中,每天有数千名用户使用。
我使用的是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}"
我集成了Firebase Crashlytics,使应用程序可以在try-catch
块中报告任何与API相关的异常。
例如:
viewModelScope.launch {
try {
val response = myRepository.getProfile()
if (response.isSuccessful) {
// continue with some business logic
} else {
Log.e(tag, "error", RunTimeException("some error")
}
} catch (throwable: Throwable){
Log.e(tag, "error thrown", throwable)
crashlytics.recordException(throwable)
}
}
已知
现在在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 hostname)
at libcore.io.Linux.android_getaddrinfo(Linux.java)
at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:74)
at libcore.io.BlockGuardOs.android_getaddrinfo(BlockGuardOs.java:200)
at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:74)
at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:135)
at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103)
...
1.连接异常
Non-fatal Exception: java.net.ConnectException: Failed to connect to my-host-address.com/123.123.123.123:443
at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:146)
at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:191)
at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.java:257)
at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.java)
at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.java:47)
...
Caused by java.net.ConnectException: failed to connect to my-host-address.com/123.123.123.123 (port 443) from /:: (port 0) after 10000ms: connect failed: ENETUNREACH (Network is unreachable)
at libcore.io.IoBridge.connect(IoBridge.java:142)
at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
at java.net.Socket.connect(Socket.java:621)
...
Caused by android.system.ErrnoException: connect failed: ENETUNREACH (Network is unreachable)
at libcore.io.Linux.connect(Linux.java)
at libcore.io.ForwardingOs.connect(ForwardingOs.java:94)
at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:138)
at libcore.io.ForwardingOs.connect(ForwardingOs.java:94)
at libcore.io.IoBridge.connectErrno(IoBridge.java:173)
at libcore.io.IoBridge.connect(IoBridge.java:134)
...
1.套接字超时异常
Non-fatal Exception: java.net.SocketTimeoutException: timeout
at okhttp3.internal.http2.Http2Stream$StreamTimeout.newTimeoutException(Http2Stream.java:4)
at okhttp3.internal.http2.Http2Stream$StreamTimeout.exitAndThrowIfTimedOut(Http2Stream.java:8)
at okhttp3.internal.http2.Http2Stream.takeHeaders(Http2Stream.java:24)
at okhttp3.internal.http2.Http2ExchangeCodec.readResponseHeaders(Http2ExchangeCodec.java:5)
at okhttp3.internal.connection.Exchange.readResponseHeaders(Exchange.java:2)
at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:145)
...
1.另一个套接字超时异常
Non-fatal Exception: java.net.SocketTimeoutException: SSL handshake timed out
at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(NativeCrypto.java)
at com.android.org.conscrypt.NativeSsl.doHandshake(NativeSsl.java:387)
at com.android.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake(ConscryptFileDescriptorSocket.java:234)
at okhttp3.internal.connection.RealConnection.connectTls(RealConnection.java:72)
at okhttp3.internal.connection.RealConnection.establishProtocol(RealConnection.java:52)
at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:196)
at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.java:257)
at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.java)
at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.java:47)
最后,让我觉得这不是我的服务器问题的是,当我向Google服务器请求横幅广告时,也会遇到这种错误。
{ "Message": "Error while connecting to ad server: Failed to connect to pubads.g.doubleclick.net/216.58.195.130:443", "Cause": "null", "Response Info": { "Adapter Responses": [], "Response ID": "null", "Response Extras": {}, "Mediation Adapter Class Name": "" }, "Domain": "com.google.android.gms.ads", "Code": 0 }
从Google Ads SDK的onAdFailedToLoad
侦听器获取。
次尝试
我试着在Retrofit2/OkHttp3 github问题中找到一些解决方案,所以社区,每个人都说可能有一些网络权限问题或网络连接问题本身。但我知道用户连接到互联网,而不是使用某种代理。我与客户服务团队合作,他们走过了用户,他们没有发现任何网络问题。
任何见解都会很有帮助。提前感谢!
2条答案
按热度按时间ngynwnxp1#
此问题可能与DNS缓存有关。如果未更新DNS缓存,则应用可能无法解析主机名。你可以尝试清除设备上的DNS缓存或使用其他DNS服务器。你还可以尝试使用其他网络连接(例如移动的数据)以查看问题是否仍然存在。
ct3nt3jp2#
大约2年前,我遇到过这样的问题。幸运的是,之前的答案不是我的情况(我在清除DNS缓存后尝试了)。我和我的ISP谈过这个问题,他们说了一些关于缓存请求和响应的事情。他们还告诉我等待24小时,服务器/ISP将释放该高速缓存,然后再尝试。我等了一会儿,它工作了。我不知道这是怎么发生的,也不知道为什么它工作了。