如何重新连接okhttp-ws

时间:2016-04-19 12:12:02

标签: java android okhttp

如果IP地址发生变化或连接失败,如何正确重新连接?

我试着重新连接okhttp-ws

.....

    @Override
    public void onFailure(IOException e, okhttp3.Response response) {
      try {
               connecting();
            } catch (Exception e1) {
            Timber.e(e1, "onFailure");
        }
    }

    @Override
    public void onClose(int code, String reason) {
        Timber.d("Connection unexpectedly closed");
        connecting();
    }

    public void connecting() {
    if (wsClient == null) {
        wsClient = builder.build();
    if (call != null) call.cancel();
    call = WebSocketCall.create(wsClient, request);
    try {
        lock.lockInterruptibly();
        try {  call.enqueue(listener);
        } finally {
            lock.unlock();
        }
    } catch (InterruptedException e) {
        Timber.e(e, "connecting error");
    }
}

我收到错误

  

java.lang.RuntimeException:无法启动服务...(有   extras)}:java.util.concurrent.RejectedExecutionException:Task   okhttp3.RealCall$AsyncCall@3f946389拒绝了   java.util.concurrent.ThreadPoolExecutor@d784f8e [终止,池大小   = 0,活动线程= 0,排队任务= 0,已完成任务= 1]                                                                             在   android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3320)

2 个答案:

答案 0 :(得分:4)

请参阅示例和我的简单library

...
try{
WebsocketClient.dispatcher().cancelAll();// to cancel all requests
}...

触发On Failed(...)您可以重新连接

答案 1 :(得分:4)

/ **      *配置此客户端是否在遇到连接问题时重试。默认情况下,      *此客户端默默地从以下问题中恢复:      *      *

         *
  • 无法访问的IP地址。如果网址的主机有多个IP地址,      *未能达到任何单个IP地址并不会使整个请求失败。这个可以      *提高多宿主服务的可用性。      *
  • 陈旧的池连接。 {@link ConnectionPool}重用套接字      *减少请求延迟,但这些连接偶尔会超时。      *
  • 无法访问的代理服务器。 {@link ProxySelector}可用于      *按顺序尝试多个代理服务器,最终回退到直接服务器      *连接。      *
     *      *将此设置为false以避免在执行此操作具有破坏性时重试请求。在这种情况下      *调用应用程序应该自己恢复连接故障。      * /

OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.retryOnConnectionFailure(true);