在Android中销毁webview

时间:2013-07-02 06:08:01

标签: android webview

无法销毁WebView

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

例如: Memory Leak in 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;        
}

有人帮帮我..谢谢..

2 个答案:

答案 0 :(得分:43)

WebView可能不会被破坏,因为你要移除onDestroy()中的视图,可以在几个不同的场合调用:当用户通过后退按钮退出应用程序时,当用户按下主页按钮时然后从最近一次刷新应用程序,或者当系统杀死你的应用程序以为其他应用程序腾出空间时。在onDestroy()中销毁WebView可能会有问题。

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

新答案:我最初在调用onDestroy方法时错了,所以我和其他人编辑了问题以删除错误的部分。但是,这也会稍微改变我为破坏WebView所做的工作。可能没有足够的时间来破坏onDestroy或it could be that the Activity is getting destroyed multiple times中的WebView,这会导致崩溃,因为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上不会调用其他任何方法。

答案 1 :(得分:0)

就我而言, 当我杀死应用程序并再次打开它时。我点击按钮打开 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