Как контролировать использование памяти при вызове нескольких WebView в Android? - PullRequest
8 голосов
/ 17 января 2012

Основным видом деятельности моего приложения является Activity, который содержит Webview для загрузки веб-страниц.

Я переопределяю метод shouldOverrideUrlLoading(WebView view, String url), чтобы каждый URL-запрос вызывал Intent и загружал новое действие, содержащее WebView.

Это сделано для того, чтобы обеспечить лучший опыт при нажатии клавиши BACK, просто завершит текущее действие и вернется к предыдущему действию, не нужно времени для повторного отображения страницы по сравнению с использованием goBack () в одном веб-просмотре.

Но теперь проблема в том, что после того, как я открыл много URL-адресов, создав длинную очередь действий в фоновом режиме, используемая им память стала большой.

Когда я возвращаюсь к программе запуска и проверяю прогресс, я вижу, что мое приложение кэширует более 200 миллионов данных. Это недопустимо ...

Интересно, что я вижу, как мое приложение израсходовало мою память, но в представлении «Куча» DDMS в Eclipse я вижу, что приложению выделено не более 10 МБ памяти. Итак, я думаю, что 200M webStorage кэшируется Webview?

Есть ли способ управления памятью?

Я рассматриваю просто сохранить, может быть, 5 слоев действий одновременно, а когда вы вернетесь назад 5 раз, просто вернитесь на домашнюю страницу. Но все еще не знаете, как освободить память помимо пяти необходимых мне занятий, которые я никогда больше не буду использовать?

Или, если WebView автоматически кэширует веб-страницу, как я могу управлять этим вручную? Например, установить максимальный размер кэша или количество страниц?

1 Ответ

1 голос
/ 21 ноября 2012

В общем, я согласен с комментарием Кевина.Я думаю, что хранить несколько Activity объектов для предотвращения перезагрузки WebView нелогично для мобильной среды с такими ограниченными ресурсами.

При этом у вас есть много разных вопросов и вариантов решения,поэтому я не имею в виду ни одного ответа.Посмотрите эти ссылки, чтобы узнать, является ли что-нибудь полезным:

ActivityManager - есть множество вещей, которые вы могли бы использовать, проверьте его подклассы.

ActivityManager.RunningTaskInfo - Никогда не использовал его, но, кажется, есть некоторые полезные вещи, особенно с определением, какие Activity работают.

ActivityManager.MemoryInfo - Может дать вам информацию о доступной системной памяти, а также о нижнем пороге памяти.

Application.onLowMemory() - Сообщает, когда ваше приложение было переполнено памятью.Вы можете переопределить этот метод и начать уничтожать Activity при вызове этого метода.Вам, вероятно, нужно позвонить super.onLowMemory(), чтобы убедиться, что операционная система обрабатывает то, что ей нужно.

Одно из возможных решений, включающее управление количеством операций:

Переопределение Application и создание public static ArrayList<Activity> который содержит 5 Activity объектов.Всякий раз, когда вы выполняете onCreate() для Activity, вы можете добавить действие к ArrayList и затем проверить размер.Если размер> 5, тогда отправьте intent на Activity в позиции 0, что заставит его обработать намерение и вызовет finish().Затем удалите объект из ArrayList.

Не должно быть слишком много работы, но недостатком является то, что вам придется вручную управлять вещами.Я уверен, что есть более разумное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...