Уничтожить веб-просмотр в Android

Не удалось уничтожить WebView

Во-первых, много примеров, которые я попробовал для уничтожения webview в Android.

Например: утечка памяти в Android

Хотя я разрушал webview в onDestroy () и программным образом объявлял 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 не может быть уничтожен, поскольку вы удаляете представление в onDestroy (), которое можно вызвать в нескольких случаях: когда пользователь выходит из приложения с помощью кнопки «Назад», когда пользователь нажимает кнопку «домой», а затем просматривает Приложение от респондентов, или когда система убивает ваше приложение, чтобы освободить место для других приложений. Может быть проблематично уничтожить WebView в onDestroy ().

Старый ответ: Чтобы удалить WebView из памяти, переопределите метод finish () и поместите код, который у вас есть в onDestroy () в finish (). Finish вызывается, когда приложение выходит через кнопку «Назад», поэтому это гарантирует, что WebView будет уничтожен.

Новый ответ: изначально я ошибался, когда был вызван метод onDestroy, поэтому я и другие отредактировали вопрос, чтобы удалить те части, которые были неправильными. Однако это также немного меняет то, что я сделал бы, чтобы уничтожить WebView. Возможно, недостаточно времени для разрушения WebView в onDestroy, или может быть, что активность несколько раз уничтожается , что приведет к сбою, так как WebView будет уничтожен несколько раз, и это приведет к его краху ( См. Цитату с документацией в нижней части этого ответа). Решение должно быть более явным при уничтожении WebView, а также для установки WebView на null, чтобы вы могли быть уверены, что он не был уничтожен, прежде чем пытаться его уничтожить.

Когда вы используете WebView.destroy (), внутренне WebView уничтожит себя, но проблема в том, что нет способа определить, вы вызвали уничтожение на существующий объект WebView или нет. Это проблематично, потому что вызов методов в 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 после уничтожения.