У меня есть действие с помощью 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?
На основании приведенных выше комментариев и дополнительных тестов я пришел к выводу, что проблема заключается в ошибке в SDK: при создании WebView через XML-макет действие передается как контекст для WebView, а не контекст приложения. При завершении действия WebView по-прежнему сохраняет ссылки на действие, поэтому действие не удаляется из памяти. Я отправил отчет об ошибке, см. Ссылку в комментарии выше.
webView = new WebView(getApplicationContext());
Обратите внимание, что этот обходной путь работает только для определенных случаев использования, например, если вам просто нужно отобразить html в веб-просмотре, без каких-либо href-ссылок, ссылок на диалоги и т. Д. См. Комментарии ниже.