Retrofit 2.6.2 不适用于 Vodafone 移动数据,但在 WiFi 上运行良好
Retrofit 2.6.2 is not working on Vodafone mobile data but works fine on WiFi
请帮助我 我的一些应用用户抱怨或反馈说他们的应用无法使用移动数据 (Vodafone 4G) 但可以使用 wifi。
我正在使用 Retrofit-2.6.2 和 okhttp3 - 4.2.2.
Retrofit.Builder()
.baseUrl(baseurl)
.addConverterFactory(GsonConverterFactory.create())
.client(getClient())
.build()
fun getClient(): OkHttpClient {
return OkHttpClient.Builder().addInterceptor(HeaderIntercepter())
.readTimeout(2, TimeUnit.MINUTES)
.writeTimeout(2, TimeUnit.MINUTES)
.connectTimeout(2, TimeUnit.MINUTES)
.build()
}
API 是在 Amazon 服务器 上使用 http 和 https 创建的。
我这边缺少什么请给我解决办法?
提前致谢。
将 network-security-config
添加到 res/xml 文件夹
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
在 manifest
文件 application
标签中添加一行
android:networkSecurityConfig="@xml/network_security_config"
并确保您在 manifest
文件
中授予 internet
权限
<uses-permission android:name="android.permission.INTERNET" />
同时将此添加到 manifest
文件
<uses-library
android:name="org.apache.http.legacy"
android:required="false"/>
在您的应用构建中添加 useLibrary 'org.apache.http.legacy'
gradle
android {
compileSdkVersion 28
defaultConfig {
applicationId "your_application_id"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
useLibrary 'org.apache.http.legacy'
}
这是一些 4G 网络问题 这里就像在 Vodafone 网络中一样。此网络中 TCP connecting 的连接时间为 connectTimeout 始终处于连接状态,因此 api在2分钟之前无法连接,因为提到2分钟[=29=超时]
所以,我通过将 connectTimeout 的 TCP 连接时间减少到 1 秒 来解决这个问题,这是代码:
OkHttpClient.Builder()
.addInterceptor(HeaderIntercepter())
.callTimeout(2, TimeUnit.MINUTES)
.connectTimeout(1, TimeUnit.SECONDS)
.readTimeout(1, TimeUnit.MINUTES)
.writeTimeout(1, TimeUnit.MINUTES)
.build()
如果你api或url不需要数据发送和接收之间的TCP连接通过改造那么你可以这样做,工作正常我现在。
请帮助我 我的一些应用用户抱怨或反馈说他们的应用无法使用移动数据 (Vodafone 4G) 但可以使用 wifi。
我正在使用 Retrofit-2.6.2 和 okhttp3 - 4.2.2.
Retrofit.Builder()
.baseUrl(baseurl)
.addConverterFactory(GsonConverterFactory.create())
.client(getClient())
.build()
fun getClient(): OkHttpClient {
return OkHttpClient.Builder().addInterceptor(HeaderIntercepter())
.readTimeout(2, TimeUnit.MINUTES)
.writeTimeout(2, TimeUnit.MINUTES)
.connectTimeout(2, TimeUnit.MINUTES)
.build()
}
API 是在 Amazon 服务器 上使用 http 和 https 创建的。
我这边缺少什么请给我解决办法?
提前致谢。
将 network-security-config
添加到 res/xml 文件夹
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
在 manifest
文件 application
标签中添加一行
android:networkSecurityConfig="@xml/network_security_config"
并确保您在 manifest
文件
internet
权限
<uses-permission android:name="android.permission.INTERNET" />
同时将此添加到 manifest
文件
<uses-library
android:name="org.apache.http.legacy"
android:required="false"/>
在您的应用构建中添加 useLibrary 'org.apache.http.legacy'
gradle
android {
compileSdkVersion 28
defaultConfig {
applicationId "your_application_id"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
useLibrary 'org.apache.http.legacy'
}
这是一些 4G 网络问题 这里就像在 Vodafone 网络中一样。此网络中 TCP connecting 的连接时间为 connectTimeout 始终处于连接状态,因此 api在2分钟之前无法连接,因为提到2分钟[=29=超时]
所以,我通过将 connectTimeout 的 TCP 连接时间减少到 1 秒 来解决这个问题,这是代码:
OkHttpClient.Builder()
.addInterceptor(HeaderIntercepter())
.callTimeout(2, TimeUnit.MINUTES)
.connectTimeout(1, TimeUnit.SECONDS)
.readTimeout(1, TimeUnit.MINUTES)
.writeTimeout(1, TimeUnit.MINUTES)
.build()
如果你api或url不需要数据发送和接收之间的TCP连接通过改造那么你可以这样做,工作正常我现在。