WebView Android中泄漏导致奇怪的内存泄漏

时间:2016-10-04 05:03:47

标签: android webview memory-leaks leakcanary

我使用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)。 有人得到像我这样的泄漏消息吗?能告诉我一些关于这条消息的提示,并帮我摆脱它。

0 个答案:

没有答案