HttpsURLConnection утечка памяти - PullRequest
       31

HttpsURLConnection утечка памяти

0 голосов
/ 22 октября 2018

Используя LeakCanary, я обнаружил утечку памяти, из-за которой произошел такой журнал.

HttpsURLConnection$NoPreloadHolder.defaultHostnameVerifier -> 
MainActivity$16.this$0 -> 
MainActivity

Единственная часть в моем коде, в которой упоминается HttpsUrlConnection, - это.

static SSLContext sc;
private void handleSSLHandshake() {
    try{
        TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {

            }

            @Override
            public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {

            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }
        }};

        sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String s, SSLSession sslSession) {
                return true;
            }
        });
    }catch (Exception e){
        Log.d(TAG, "handleSSL err: "+e.getMessage());
    }
}

Если я правильно помню, этот код предназначен для того, чтобы Volley принимал запросы https.Я видел сообщение, в котором говорится, что мне нужно закрыть URLConnection, но HttpsURLConnection не имеет метода для его закрытия.Настройка SSlContext в static ничего не изменила.

Я звоню handleSSLHandshake() на onCreate() MainActivity.

Это предыдущий handleSSLHandshake() метод.

private void handleSSLHandshake() {
    try{
        TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {

            }

            @Override
            public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {

            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }
        }};

        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String s, SSLSession sslSession) {
                return true;
            }
        });
    }catch (Exception e){
        Log.d(TAG, "handleSSL err: "+e.getMessage());
    }
}

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

удалить модификатор static перед SSLContext sc.

0 голосов
/ 22 октября 2018

Вам необходимо закрыть HttpsUrlConnection, используя метод disconnect().

...