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.2okhttp3 - 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()
}

A​​PI 是在 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连接通过改造那么你可以这样做,工作正常我现在。