我使用OkHttp
将文件流式传输到服务器。我的代码看起来像这样:
OkHttpClient client = new OkHttpClient.builder()
.connectTimeout(20, TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.writeTimeout(20, TimeUnit.SECONDS)
.retryOnConnectionFailure(false)
.build();
Response response = null;
try {
RequestBody requestBody = new RequestBody() {
private long uploadedBytes;
@Override
public MediaType contentType() {
// return type based on file
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
byte[] buffer = new byte[8 * 1024];
int count = 0;
while ((count = source.read(buffer)) != -1) {
sink.write(buffer, 0, count);
}
source.close();
}
}
final Request request = new Request.Builder()
.url(uploadUrl)
.put(requestBody)
// header stuff
.build();
response = client.newCall(request).execute();
} catch (IOException e) {
// handle
}
在我的代码中,流媒体文件(字节)和我在OkHttpClient
设置的超时时间是20秒。
所以,这就是我的情况 - 当手机连接到WiFi点时,用户正在LTE上传文件。现在发生的事情是OkHttp继续上传一段时间(我认为是超时值,但我不太确定),然后管道坏了就失败了。
javax.net.ssl.SSLException: Write error: ssl=0x74a6315680: I/O error during system call, Broken pipe
at com.android.org.conscrypt.NativeCrypto.SSL_write(Native Method)
at com.android.org.conscrypt.OpenSSLSocketImpl$SSLOutputStream.write(OpenSSLSocketImpl.java:824)
at okio.Okio$1.write(Okio.java:78)
...
此时,只要JobScheduler
感觉到,任务就会被重新安排并在WiFi上接听。总而言之,LTE和WiFi之间的切换变得相当痛苦,并且在美好的一天(超时加调度程序)需要长达30秒。
考虑到反向场景完全正常(WiFi - > LTE),我希望OkHttp
中有可能用来改善这种转变的东西吗?我的OkHttp
版本是3.4.1