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 上调用其他方法。