Intereting Posts
Android-карты: как определить центр карты после завершения перетаскивания Как получить разрешение экрана в Android Honeycomb? Широковещательный приемник и ResultReceiver в android Scrollview с пейджингом в android Как получить цвет фона уведомлений по умолчанию для пользовательского уведомления в Lollipop? Как объединить кордовую, пешеходную и ионную рамки Получить реальный путь от URI, Android KitKat новая система хранения данных Переадресация вызова с одного устройства на другое через Bluetooth Легкий HTML-шаблон для Android Как удалить свое приложение с Android-рынка Использование CardView и RecyclerView в моих файлах макета генерирует исключение Каковы плюсы и минусы использования configChanges = «ориентация» для устройств Android? Макеты Eclipse и Android XML дают «по умолчанию» не лучшее соответствие для любой комбинации устройств / локалей » Одно приложение установлено, отображает две записи в пусковой установке Нижняя компоновка в навигационном ящике Android

Проблемы с распределением памяти с помощью приложения android

У меня есть приложение для Android, которое выполняет анализ изображений, который управляется с помощью IntentService – процесс занимает пару секунд каждый раз и работает точно и быстро.

Но когда процесс повторяется в приложении примерно в 50 раз (как показано на рисунке), он начинает становиться очень медленным до тех пор, пока приложение и устройство не станут непригодными для использования. Когда устройство перезагружается и приложение открывается снова, оно выполняется, как обычно.

Проверка в Android Studio. Я вижу, что каждый раз, когда я запускаю анализ, распределение памяти для приложения увеличивается и увеличивается каждый раз примерно на 1 МБ . Поэтому, когда он падает, у него явно не хватает памяти.

Я использовал этот флаг для завершения анализа и перехода к результату, чтобы исправить фоновые действия;

 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 

Который имеет минимальный эффект, и я понимаю, что IntentService управляет тем, что закрывается. Поэтому не уверен, что еще я могу сделать, чтобы попытаться уменьшить распределение памяти или хотя бы снять выделение и перестать добавлять к ней?

Рабочий процесс анализа изображений

Дальнейшие подробности:

  • Приложение использует реализацию камеры на основе Google Camera2
  • Анализ выполняется с помощью библиотеки C ++ через IntentService

Solutions Collecting From Web of "Проблемы с распределением памяти с помощью приложения android"

Кажется, что вы не правильно обрабатываете ресурсы (переменные, файлы изображений и т. Д.), А также создаете утечку памяти в своем приложении.

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

Избегайте утечек памяти на Android

Если утечка памяти генерируется в библиотеке c ++, вы можете легко найти ресурс, который пропускает память в режиме отладки.

После результата результата вы должны вызвать сборщик мусора, как было предложено Grisgram, и закрыть любые неиспользуемые ресурсы.

Было бы хорошо, если бы вы могли предоставить трассировку стека в вопросе.

Попробуйте использовать leakCanary https://github.com/square/leakcanary, чтобы узнать, что вызывает утечку, и используйте функцию weakReference https://developer.android.com/reference/java/lang/ref/WeakReference.html, чтобы разрешить это При необходимости собирать мусор. Также может случиться, что используемое устройство не имеет достаточного объема памяти для одновременного хранения 50 изображений с высоким разрешением в памяти. Вы можете попытаться снизить разрешение изображений, если вы храните их в памяти, и убедитесь, что вы перерабатываете растровые изображения https://developer.android.com/topic/performance/graphics/manage-memory.html.

Я также хотел бы использовать threadPoolExecutor вместо службы намерения, они гораздо более настраиваются https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html

Я хотел добавить что-то к ответу Ali786.

Intent Services на самом деле не лучший выбор для того, что будет повторяться. При следующем вызове службы он переходит в очередь. Intent Services работают как HandlerThreads. У них есть свои собственные MessageQueue, и после того, как вы запустите сервис с Intent, он будет ждать предыдущего.

Обычные службы, которые запускаются в потоке пользовательского интерфейса, работают параллельно.

Я не уверен, что вы делаете что-то после того, как вы отправите информацию анализа на вашу деятельность, но если вы это сделаете, служба намерения не умрет, а следующей придется ждать. Интеллектуальные услуги не являются лучшим выбором для общения с вашим потоком пользовательского интерфейса, Asynctask может быть лучше в вашем случае. Если вы дадите нам дополнительную информацию (код), возможно, мы сможем дать вам более точный ответ. Надеюсь это поможет!

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

Проверить настройки, запускающие список служб для запуска службы вашего приложения