首先,我尝试了很多例子来破坏Android中的webview。
虽然我在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;
}
有人帮帮我..谢谢..
答案 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