HttpsURLConnection memory leak



使用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 请求。我看到一些帖子说我需要关闭URLConnectionHttpsURLConnection没有关闭它的方法。SSlContextstatic并没有改变任何事情。

我打电话给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());
}
}

您需要使用disconnect()方法关闭HttpsUrlConnection

在 SSLContext sc 之前删除修饰符 static。

最新更新