Как управлять использованием памяти при вызове нескольких WebView в Android?

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

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

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

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

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

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

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

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

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

Solutions Collecting From Web of "Как управлять использованием памяти при вызове нескольких WebView в Android?"

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

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

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

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

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

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

Одно из возможных решений, связанных с контролем количества видов деятельности:

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

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