使用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());
}
}
您需要使用disconnect()
方法关闭HttpsUrlConnection
。
在 SSLContext sc 之前删除修饰符 static。