35

无法销毁 WebView

首先,我尝试了很多示例来破坏 Android 中的 webview。

例如: Android 中的内存泄漏

虽然我在 onDestroy() 中销毁了 webview 并以编程方式声明了一个 webview,但我的 Android 设备中也会发生内存泄漏问题。

下面是我的编码..

public class MainActivity extends Activity {
private FrameLayout mWebContainer;
private WebView mWebView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.your_layout);

    mWebContainer = (FrameLayout) findViewById(R.id.web_container);
    mWebView = new WebView(getApplicationContext());
    mWebContainer.addView(mWebView);
}

@Override
protected void onDestroy() {
    super.onDestroy();

    mWebContainer.removeAllViews();
    mWebView.clearHistory();
    mWebView.clearCache(true);
    mWebView.clearView();
    mWebView.destroy();
    mWebView = null;        
}

请有人帮助我..谢谢..

4

2 回答 2

63

WebView 可能不会被销毁,因为您正在删除 onDestroy() 中的视图,这可以在几种不同的情况下调用:当用户通过后退按钮退出应用程序时,当用户按下主页按钮然后滑动最近的应用程序,或者当系统终止您的应用程序以为其他应用程序腾出空间时。在 onDestroy() 中销毁 WebView 可能会有问题。

旧答案: 要从内存中删除 WebView,请覆盖 finish() 方法并将您在 onDestroy() 中的代码放在 finish() 中。当应用程序通过后退按钮退出时调用完成,因此这将确保 WebView 被销毁。

新答案:我最初对 onDestroy 方法的调用时间有误,所以我和其他人编辑了问题以删除错误的部分。但是,这也会稍微改变我销毁 WebView 的方法。可能是onDestroy中没有足够的时间来销毁WebView,也可能是Activity被多次销毁导致崩溃,因为WebView会被多次销毁而导致崩溃(请参阅此答案底部的文档引用)。解决方案是在销毁 WebView 时更加明确,并将 WebView 设置为 null,这样您就可以确保在尝试销毁它之前它没有被销毁。

当您使用 WebView.destroy() 时,WebView 会在内部自行销毁,但问题是无法确定您是否在现有 WebView 对象上调用了destroy。这是有问题的,因为在销毁 WebView 后调用方法会导致崩溃。解决方法是在销毁 WebView 后将其设置为 null。

你杀死视图的完整代码应该是这样的(有些东西是可选的):

public void destroyWebView() {

    // Make sure you remove the WebView from its parent view before doing anything.
    mWebContainer.removeAllViews();

    mWebView.clearHistory();

    // NOTE: clears RAM cache, if you pass true, it will also clear the disk cache.
    // Probably not a great idea to pass true if you have other WebViews still alive.
    mWebView.clearCache(true);

    // Loading a blank page is optional, but will ensure that the WebView isn't doing anything when you destroy it.
    mWebView.loadUrl("about:blank");

    mWebView.onPause();
    mWebView.removeAllViews();
    mWebView.destroyDrawingCache();

    // NOTE: This pauses JavaScript execution for ALL WebViews, 
    // do not use if you have other WebViews still alive. 
    // If you create another WebView after calling this, 
    // make sure to call mWebView.resumeTimers().
    mWebView.pauseTimers();

    // NOTE: This can occasionally cause a segfault below API 17 (4.2)
    mWebView.destroy();

    // Null out the reference so that you don't end up re-using it.
    mWebView = null;
}

然后应该在某个地方调用此方法,最好在 finish() 中调用,因为这将由用户显式调用,但它也应该在 onDestroy() 中工作。

注意:我应该补充一点,调用mWebView.onDestroy()两次可能会使浏览器崩溃。文档状态:

销毁后,不能在此 WebView 上调用其他方法。

于 2013-07-03T21:40:56.873 回答
1

就我而言,当我杀死应用程序并再次打开它时。我单击按钮打开 webview,然后应用程序崩溃了。

因此,我以以下方式对包含活动的 webview 的 onDestroy() 进行了更改。现在我的应用程序在执行此操作后没有崩溃。

@Override
    protected void onDestroy() {
        super.onDestroy();
        webView.clearCache(true);
        webView.clearHistory();
        webView.onPause();
        webView.removeAllViews();
        webView.destroyDrawingCache();
        webView.pauseTimers();
        webView=null;
        super.onStop();
        finish();
    }

如果他们和我有同样的问题,希望它会在某个时候对某人有所帮助。感谢@anthonycr

于 2021-03-17T13:48:58.090 回答