我们在处理Android网络请求时遇到了问题,更确切地说是随机收到的
SocketException:
java.net.SocketException: socket is closed
at com.android.org.conscrypt.ConscryptFileDescriptorSocket$SSLInputStream.read(ConscryptFileDescriptorSocket.java:551)
看起来请求似乎不会超时,但异常抛出非常快,并且似乎仅在发布模式下发生,我们猜测这可能与ProGuard有关。
我们正在使用Retrofit、Moshi和RxAndroid进行网络请求。有人遇到过这样的问题吗?
我们的依赖项及其版本:
implementation ‘io.reactivex.rxjava2:rxandroid:2.1.1’
implementation ‘io.reactivex.rxjava2:rxjava:2.2.9’
implementation ‘com.squareup.retrofit2:adapter-rxjava2:2.5.0’
//Moshi
def moshiVersion = “1.12.0”
implementation “com.squareup.moshi:moshi:$moshiVersion”
kapt “com.squareup.moshi:moshi-kotlin-codegen:$moshiVersion”
implementation “com.squareup.retrofit2:converter-moshi:2.9.0"
implementation “com.squareup.moshi:moshi-kotlin:1.8.0”
//Networking
implementation ‘com.squareup.okhttp3:logging-interceptor:3.12.1’
implementation ‘com.squareup.retrofit2:retrofit:2.6.4’
implementation ‘com.squareup.retrofit2:converter-scalars:2.1.0’
我们所有的模型都使用了@Keep注解进行了标注:
@Keep
class ModelDTO(
@field:Json(name = “field1")
var field1: String? = null,
@field:Json(name = “field2”)
var field2: List<String>? = null
)
HttpClient + Retrofit:
val client = OkHttpClient.Builder()
.connectTimeout(300, TimeUnit.SECONDS)
.writeTimeout(300, TimeUnit.SECONDS)
.readTimeout(300, TimeUnit.SECONDS)
client.retryOnConnectionFailure(true)
.addNetworkInterceptor { chain ->
val request = chain.request().newBuilder().addHeader(“Connection”, “close”).build()
chain.proceed(request)
}
val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
val retrofitBuilder = Retrofit.Builder()
retrofitBuilder.baseUrl(BuildConfig.BASE_URL)
retrofitBuilder.client(client)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(MoshiConverterFactory.create(moshi).asLenient())
.addCallAdapterFactory(
RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io())
)
我们的 Gradle 配置:
release {
debuggable false
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
consumerProguardFiles 'proguard-rules.pro'
}