Утечка памяти в веб-представлении

У меня есть действие с помощью xml расположения, где веб-представление встраивается. Я не использую веб-представление в своем коде деятельности вообще, все, что это делает находится там в моем xml расположении и видимый.

Теперь, когда я заканчиваю действие, я нахожу, что мое действие не очищается из памяти. (Я проверяю через дамп hprof). Действие полностью очищено хотя, если я удаляю веб-представление из xml расположения.

Я уже попробовал a

webView.destroy();
webView = null;

в onDestroy () моего действия, но это не помогает многому.

В моем дампе hprof мое действие (названный 'Браузером') имеет следующие остающиеся корни GC (после того, как звонил destroy() на нем):

com.myapp.android.activity.browser.Browser
  - mContext of android.webkit.JWebCoreJavaBridge
    - sJavaBridge of android.webkit.BrowserFrame [Class]
  - mContext of android.webkit.PluginManager
    - mInstance of android.webkit.PluginManager [Class]  

Я нашел, что другой разработчик испытал подобную вещь, посмотрите ответ Filipe Abrantes на: http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/

Действительно очень интересное сообщение. Недавно мне было очень нелегко диагностировать утечку памяти на моем приложении для Android. В конце оказалось, что мое xml расположение включало компонент веб-представления, который, даже если не используемый, препятствовал тому, чтобы память была g-collected после того, как экранные вращения/приложение перезапускают …, это ошибка текущей реализации или там что-то определенное, которое нужно сделать при использовании WebViews

Теперь, к сожалению, еще не было никакого ответа на блог или список рассылки об этом вопросе. Поэтому я задаюсь вопросом, это - ошибка в SDK (возможно, подобный ошибке MapView как http://code.google.com/p/android/issues/detail?id=2181, о котором сообщают) или как получить действие полностью от памяти со встроенным webview?

73
задан Mathias Conradt 28 June 2010 в 07:16
поделиться

1 ответ

На основании приведенных выше комментариев и дополнительных тестов я пришел к выводу, что проблема заключается в ошибке в SDK: при создании WebView через XML-макет действие передается как контекст для WebView, а не контекст приложения. При завершении действия WebView по-прежнему сохраняет ссылки на действие, поэтому действие не удаляется из памяти. Я отправил отчет об ошибке, см. Ссылку в комментарии выше.

webView = new WebView(getApplicationContext());

Обратите внимание, что этот обходной путь работает только для определенных случаев использования, например, если вам просто нужно отобразить html в веб-просмотре, без каких-либо href-ссылок, ссылок на диалоги и т. Д. См. Комментарии ниже.

54
ответ дан 24 November 2019 в 12:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: