我使用leakcanary 来检测我的应用程序内存并发现一个包含webview 的Activity 泄漏。当我删除有关 WebView 的代码时,它检测到没有泄漏。但是,在添加 webview 的代码时,leakcanary 显示了一个非常奇怪的消息,例如这个泄漏消息。它显示了由 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 函数中,我将它从视图层次结构中删除,但leakcanary 仍然显示泄漏消息(我确定我的代码中没有使用TextToSpeech)。有人收到和我一样的泄密信息吗?您能否告诉我有关该消息的一些提示并帮助我摆脱它。