bla*_*ara 8 android econnreset okhttp okhttp3
或者认为此场景的拦截器适用?
我们的应用程序使用OkHttp下载文件(应用程序的新版本,每日数据库等)
有时服务器在app流式传输字节时失败(顺便说一下,问题是,recvfrom失败:ECONNRESET)
所以为了解决这个问题,我只想编写OkHttp重试拦截器.但似乎这适用于不流式传输的操作.
是否有解决方案(如拦截器)来处理这种情况?
要做更清楚的阐述
0%============================== 100%(刚开始流式传输)
0%=== ========================= 100%(已完成10%)
0%====== ======================== 100%(已完成20%)
0%====== ======================== 100%(ECONNRESET - 由同行重置连接)
就在这时,流媒体就停止了.我想从OkHttp那里得到的东西是认识到这种情况然后从头开始流(而不是20%)
相关代码在这里,注意评论
 Call call = client.newCall(new Request.Builder().url(url).get().build());
 Response response = call.execute();
 // PROBLEM DOES NOT OCCUR THERE
 // PROBLEM DOES NOT OCCUR THERE
 // PROBLEM DOES NOT OCCUR THERE
 if (response.code() == 200 || response.code() == 201) {
     InputStream inputStream = null;
     try {
         long downloaded = 0;
         byte[] buff = new byte[1024 * 4];
         inputStream = response.body().byteStream();
         long target = response.body().contentLength();
         while (true) {
             // EXCEPTION OCCURS THERE
             // EXCEPTION OCCURS THERE
             // EXCEPTION OCCURS THERE
             int read = inputStream.read(buff);
             if (read == -1) {
                 break;
             }
             downloaded += read;
         }
         ...
     } catch (IOException e) {
         // EXCEPTION SAYS 
         // ECONNRESET - Connection reset by peer
         ...
     }
}
Run Code Online (Sandbox Code Playgroud)
    您可以编写一个自定义拦截器,如下所示:
OkHttp 有拦截器。您需要一个自定义拦截器,如下所示:
public class CustomResponseInterceptor implements Interceptor {
    private final String TAG = getClass().getSimpleName();
    @Override
    public Response intercept(Object object) throws IOException {
        Request request = chain.request();
        Response response = chain.proceed(request);
        if (response.code() != 200//Your error code here,) {
           //Cancel your Request here
            return something;
        }
        Log.d(TAG, "INTERCEPTED:$ " response.toString());
        return response;
    }
Run Code Online (Sandbox Code Playgroud)
显示的代码摘自这篇有关拦截器的 Medium 文章。
您还可以查看这个实现重试拦截器的库,但您可以对其进行修改以供您使用。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           1408 次  |  
        
|   最近记录:  |