Уничтожить веб-просмотр в Android - программирование
Подтвердить что ты не робот

Уничтожить веб-просмотр в 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;        
}

Кто-нибудь мне поможет.. спасибо..

4b9b3361

Ответ 1

WebView не может быть уничтожен, поскольку вы удаляете представление в onDestroy(), которое может быть вызвано в нескольких случаях: когда пользователь выходит из приложения с помощью кнопки "Назад", когда пользователь нажимает кнопку "домой" и затем удаляет приложение из откликов или когда система убивает ваше приложение, чтобы освободить место для других приложений. Может быть проблематично уничтожить WebView в onDestroy().

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

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

Когда вы используете 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 после уничтожения.