我使用leakcanary检测我的应用程序内存,发现包含webview的Activity泄漏。当我删除有关WebView的代码时,它检测不到泄漏。但是,在添加webview代码时,leakcanary会显示一条非常奇怪的消息,例如leak message。它显示了由TextToSpeech引起的泄漏,但实际上我并没有使用这个类。我确定泄漏是由WebView造成的,所以我谷歌问题并发现它似乎是一个着名的"在Android中泄露。我尝试了很多解决方案,但没有一个可以解决。这是关于我的FaceWebViewActivity中的WebView的代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_face_webview);
webContainer = (RelativeLayout) findViewById(R.id.webview_container);
webView = new WebView(this);
webView.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
webContainer.addView(webView);
// 初始化网页浏览器
webView.requestFocus();
webView.setWebChromeClient(new WebChromeClient());
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDefaultTextEncodingName("utf-8");
webView.setHorizontalScrollBarEnabled(false);
webView.setVerticalScrollBarEnabled(false);
}
@Override
protected void onResume() {
super.onResume();
webView.loadUrl(URL);
webView.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url){
webView.loadUrl("javascript:faceDraw()");
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
RefWatcher refWatcher = BaseApplication.getRefWatcher(this);
refWatcher.watch(this);
if (webView != null) {
ViewGroup parent = (ViewGroup) webView.getParent();
if (parent != null) {
parent.removeView(webView);
}
webView.getSettings().setJavaScriptEnabled(false);
webView.setWebChromeClient(null);
webView.setWebViewClient(null);
webView.setTag(null);
webView.clearHistory();
webView.removeAllViews();
webView.destroy();
webView = null;
}
}
我用Java代码初始化了一个WebView,并没有在xml中添加它。在destroy函数中,我从视图层次结构中删除了它,但是泄漏仍然显示泄漏消息(我确定我没有在我的代码中使用TextToSpeech)。 有人得到像我这样的泄漏消息吗?能告诉我一些关于这条消息的提示,并帮我摆脱它。