0

由于打开的连接太多,几天后服务器因打开文件问题而挂起。

我有构造函数,每次都会创建一个新对象

OkHttpClient client = new OkHttpClient.Builder().sslSocketFactory(sslContext.getSocketFactory())
                                .build();

之后,我为 GET 和 POST 方法编写了一个单独的方法。

Response response = null;

Request.Builder requestBuilder = new Request.Builder();
requestBuilder.url(url);
requestBuilder.header("appId", BuildConfig.APPLICATION_ID);
requestBuilder.header("appVersion", BuildConfig.VERSION_NAME);
requestBuilder.header("deviceId", UserPrefs.getDeviceID());
requestBuilder.header("accessToken", UserPrefs.getAccessToken());
requestBuilder.header("versionCode", String.valueOf(BuildConfig.VERSION_CODE));
requestBuilder.header("securityCounter", UserPrefs.getSecurityToken());

Request okHttpRequest = requestBuilder.build();

OkHttpClient.Builder b = new OkHttpClient.Builder();
                b.readTimeout(65, TimeUnit.SECONDS);
                b.writeTimeout(65, TimeUnit.SECONDS);
                b.connectTimeout(65, TimeUnit.SECONDS);
                client = b.build();

                response = client.newCall(okHttpRequest).execute();

之后基于“response.code()”响应在 Fragment 或 Activity 中处理。最后,

我正在调用 response.close()。

现在在 Fragment 中,我创建了一个异步类并在 doInBackground 方法中调用此 GET 和 POST 方法,并在同一类的 onPostExecute 方法中处理响应。

像这样

 OkHttpClientAPI okHttpClientAPI = new OkHttpClientAPI(LoginActivity.this);
 response = okHttpClientAPI.doPostRequest(url, formBody, LoginActivity.this);

我们可以重用连接池,而不是总是创建新连接。

所以它不会超过服务器端的 65535 计数。

4

1 回答 1

0

在你的构造函数中这样做

    OkHttpClient okHttpClient; // global variable 
     public YourConstructor() {
            if (okHttpClient == null) {
                okHttpClient = new OkHttpClient();
            }
        }
于 2017-10-25T06:42:54.587 回答