在Android中销毁webview

无法销毁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; } 

有人帮助我..谢谢..

Solutions Collecting From Web of "在Android中销毁webview"

WebView可能不会被破坏,因为您正在删除onDestroy()中的视图,这可以在几个不同的场合调用:当用户通过后退button退出应用程序时,当用户按下homebutton,然后滑动应用程序从最近,或者当系统杀死您的应用程序,为其他应用程序腾出空间。 在onDestroy()中销毁WebView可能会有问题。

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

新的答案:我最初错误的时候onDestroy方法被调用,所以我和其他人编辑的问题,以删除错误的部分。 不过,这也稍微改变了我会做的摧毁WebView。 这可能是因为没有足够的时间来销毁onDestroy中的WebView,或者Activity可能被多次销毁 ,这会导致崩溃,因为WebView会被多次销毁,从而导致崩溃请参阅本答案底部的文档引用)。 解决方法是在销毁WebView时更明确一些,也可以将WebView设置为null,以确保它在销毁之前不被破坏。

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

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

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