使用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并没有改变任何事情。
我在onCreate() of MainActivity上给handleSSLHandshake()打电话。
这是前面的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());
}
}发布于 2018-10-22 16:40:56
您需要使用disconnect()方法关闭HttpsUrlConnection。
发布于 2018-10-22 19:38:07
删除SSLContext sc之前的静态修改量。
https://stackoverflow.com/questions/52925221
复制相似问题