OkHttp post-streaming - 从蜂窝切换到WiFi

时间:2017-01-10 18:35:21

标签: android okhttp okhttp3

我使用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

0 个答案:

没有答案