На андроиде не хватает памяти: Не хватает места на телефоне (Андроид), недостаточно памяти. Что можно сделать?

Содержание

Не хватает памяти на Андроиде: 6 рабочих советов

Главная » Телефоны

ТелефоныСергей Кин01.2к.

Ситуация, когда у пользователя не хватает памяти на андроиде, является распространенным явлением. В некоторых ситуациях этому способствует большое количество установленных утилит, в других – программные и аппаратные неполадки. Сначала важно попытаться решить проблему доступными средствами, только после этого обращаться к специалистам.

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

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

Содержание

  1. Что делать если нет свободного места
  2. Micro SD карта
  3. Очистка обновлений
  4. Сброс системы
  5. CCleaner в помощь
  6. Удаление ненужных приложений или перенос на sd карту
  7. Удаление кэша
  8. Что еще может помочь
  9. Заключение
  10. Видео

Что делать если нет свободного места

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

Micro SD карта

Самое элементарное решение – купить Micro SD карту, поддерживаемую вашим смартфоном. Различают несколько видов чипов:

  1. SD
  2. Mini SD
  3. Micro SD

Объемы встречаются разные от 1 GB и до 1000 GB, популярностью пользуются 32 и 64 гиговые модели.

Очистка обновлений

Одной из основной причин недостатка места являются накопление сервисами Google Play обновлений. Нужно зайти в «Сервисы Google Play», после чего нажмите «Хранилище», далее «Удалить обновления». Для удаления данных нажмите «стереть данные», такое требуется в случае очистки лишних данных.

Обновления Play Market происходят в автоматическом режиме, поэтому потребуется периодически повторять это операцию.

Сброс системы

Эффективным способом очистки хранилища можно считать сброс настроек. Воспользоваться можно такой процедурой только в некоторых случаях, так как это приведет к удалению всех файлов и настроек телефона.

Для этого нужно зайти в пункт «Восстановление и сброс» в меню настроек, где можно сбросить все настройки.

CCleaner в помощь

Действенным способом является очистка памяти при помощи различных специализированных утилит. Зайдите в Play Market и установите нужную программу, например, CCleaner. Данное приложение удалит все лишние файлы, которые являются «мусором» для системы. Это поможет не только увеличить доступное место на хранилище, но и ускорить процессы устройства в целом.

Удаление ненужных приложений или перенос на sd карту

Свободная память на гаджете появится тогда, когда будут удалены лишние программы или перенесены на внешний носитель, например, SD-карту. Система андроид позволяет через внутренние настройки хранилища при помощи кнопки «Переместить на SD карту», перенести программы на карту, что позволит увеличиться объему памяти.

Удаление кэша

Для удаления КЭШа в приложениях потребуется зайти в «Сервисы Google Play», выбрать приложение и удалить самостоятельно временные файлы. После этого будет невозможно найти некоторые файлы, которые являлись временными.

Что еще может помочь

Есть еще несколько способов, которые позволят увеличить объем хранилища:

  • Очистить Dalvik Cache. Но такое кэш-хранилище есть не у всех андроидов, только у топовых моделей. Для этого потребуется включить режим Recovery (зажать три кнопки одновременно: домой, громкость вверх, включение). Далее, Wipe cache partition, Advanced, Wipe Dalvik Cache. Это позволит очистить кэш телефона полностью.
  • Очистить папку Data. Для этого нужен root-режим, который включается автоматически при недостаточности места. Необходимо найти папку lib по пути /data/app-lib/appname/.

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

  • перенести некоторые приложения из data/app в /system/app/ вручную;
  • некоторые устройства от Samsung позволяют очистить журнал командой *#9900#.

Заключение

Проблема с количеством доступного объема обычно решается легко: установка SD-карты, удаление cash и так далее. Только в том случае, если эти способы не смогли помочь, то android придется отнести к специалистам.

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

Видео

Рейтинг

( Пока оценок нет )

Сергей Кин/ автор статьи

Ведущий автор многих рубрик на сайте expertland. ru. Отлично разбирается в техники и электронике. Способен решить любую техническую задачу в считанные часы, любит писать о своей опыте и наработках.

опубликованных статей — 94
читателей — 23 919
на сайте с 25 сентября 2017 года

Поделиться:

4 способа освободить память в смартфоне, когда её не хватает. Для устройств с малым количеством Гб

Удаляйте кеш

Если вы активно будете пользоваться браузером и соцсетями, они смогут забить пространство на накопителе. Эти приложения охотно сохраняют кеш — файлы со страниц, чтобы быстрее загружать их в будущем. Обратная сторона возможности — память быстро забивается ненужными файлами.

Как это сделать в Google Chrome на Android:

Пройдите по «Дополнительно» —> «Настройки» —> «Дополнительно» —> «Очистить историю». Из трёх пунктов поставьте галочку напротив «Изображения и другие файлы, сохранённые в кеше». В разделе «Временной диапазон» выберите «За всё время».

Также охотно заполняют пространство на накопителе онлайн-карты. Если вы сохранили область в кеше, когда были в путешествии в другом городе или стране, самое время её удалить.

Фото © Pexels

Вот как это делается в Google-картах:

Пройдите по «Профиль» —> «Офлайн-карты» и в разделе «Скачанные карты» удалите ненужные.

  • В коробку к iPhone не положат наушники? Комплект к смартфонам Apple один из худших в мире

    23 мая 2020, 12:00

  • 7 ежедневных привычек, которые медленно, но верно разрушают ваш мозг

    23 мая 2020, 07:00

  • Сколько памяти нужно смартфону в 2020 году. Минимальные объёмы для всех задач

    21 мая 2020, 17:30

Следите за мессенджерами и «Инстаграмом»

В ряде приложений, которыми мы часто пользуемся, включена автоматическая загрузка файлов. WhatsApp сохраняет все фото и видео, которые вам присылают собеседники, Telegram — все файлы, которые вы видите в каналах, Instagram — снимки с фирменными фильтрами. В итоге одна из таких папок может занять много места на накопителе.

В каждом приложении сохранение файлов можно отключить. Наиболее гибкие настройки их сохранения — в WhatsApp.

Как отключить автоматическое сохранение фото и видео в WhatsApp:

Зайдите в «Настройки» —> «Данные и хранилище». Вы увидите раздел «Автозагрузка медиа» и сможете управлять сохранением файлов — они могут вообще не перемещаться в память телефона или сохраняться, но только при подключённом Wi-Fi.

Как отключить автоматическое сохранение файлов в Telegram для Android:

Зайдите в «Настройки» —> «Данные и память». Вы найдёте два пункта: «Автозагрузка медиа» и «Использование памяти». Отключите оба, а затем включите автоматическую очистку кеша, чтобы сохранённые картинки долго не пылились в памяти смартфона.

Фото © Pexels

А вот как это сделать в Telegram для iOS:

Зайдите в «Настройки» —> «Данные и память» —> «Автозагрузка медиа». Отключите автозагрузку или ограничьте её только для отдельных типов файлов. Заодно не помешает включить автоматическую очистку кеша в разделе «Использование памяти».

Как отключить сохранение фотографий с фирменными фильтрами в «Инстаграме»:

Зайдите в «Настройки» —> «Аккаунт» —> «Исходные фото» и отключите «Сохранять исходные фото».

После проделанных операций зайдите в «Галерею» и удалите папки этих приложений, чтобы они не занимали места на накопителе.

«Google Музыка» мертва. Нашли 5 лучших стриминговых сервисов для Android-смартфона на замену

Удалите ненужные плей-листы и фильмы

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

Чтобы не было проблем, нужно мониторить, какие треки и фильмы загружены. Те, которые вы не смотрите и не слушаете, стоит удалить.

Нужно проделать две операции. Во-первых, удалите все ненужные вам треки.

Фото © Pixabay

Вот как это делается в Apple Music:

Откройте вкладку «Медиатека» —> нажмите и удерживайте альбом исполнителя, плей-лист или песню, которые хотите удалить, до появления всплывающего меню —> выберите «Удалить из медиатеки».

Во-вторых, отключите автозагрузку музыки. Бывает, стриминговый сервис автоматически сохраняет песни, которые вы просто послушаете.

В Apple Music это делается так:

Пройдите по пути «Настройки» —> «Музыка» —> «Автоматические загрузки». Если функция включена, то каждая прослушанная песня будет сохраняться. Отключите её.

Продажи iPhone упали на 77%, но Apple выживет. Зато целый ряд смартфонов умрут?

Пользуйтесь чистящими приложениями. Но осторожно

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

Вот самые известные:

  • CCleaner;
  • Clean Master;
  • Smart Booster;
  • Easy Uninstaller;
  • SCleaner;
  • All-in-one-Toolbox.

Перед этим не забудьте сделать резервную копию устройства. Это возможно с помощью Google или iCloud, а также с помощью сторонних приложений. Одно из таких — AppMonster.

Как возникает ошибка OutOfMemory и как ее решить в Android?

Продолжая наше путешествие от понимания ошибки OutOfMemory из предыдущей статьи, мы теперь проверим основные причины, вызывающие ошибку OOM в Android Studio. Каждый разработчик Android должен сталкиваться с ошибкой OutOfMemoryError, иногда известной как OOM. Если вы еще не сталкивались с OOM в своем Android-приложении, вы столкнетесь с ним в ближайшем будущем. Утечки памяти вызывают ошибку OutOfMemoryError в Android. Чтобы устранить OutOfMemoryError, вы должны сначала устранить утечки памяти из вашего приложения Android.

Ошибка!

Но, во-первых, что такое утечка памяти?

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

Пример: Если система Android выделяет вашей программе, например, 200 МБ, ваше приложение может использовать только 200 МБ за раз. Если объем пространства, отведенного для программы, со временем уменьшается или если доступно очень мало места, сборщик мусора (GC) освободит память, занимаемую переменными и действиями, которые больше не используются. В результате приложение снова получит место.

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

Мы сталкиваемся с ошибкой OutOfMemoryError в Android из-за явления утечки памяти в Android, потому что ваш код содержит ссылки на объекты, которые больше не требуются, и сборщик мусора не может выполнять свою работу, а ваше приложение использует все выделенное пространство к нему системой Android и требует большего.

Что может быть причиной ошибки OutOfMemoryError? Ошибка

OutOfMemoryError в Android может возникать по разным причинам. Ниже приведены некоторые из наиболее типичных причин утечек памяти, которые приводят к ошибке OutOfMemoryError:

  • Внутренний класс, который не является статическим
  • Использование getContext() и getApplicationContext() неправильно()
  • Применение статического представления , контекст или действие

Давайте рассмотрим каждый из них по одному:

1. Внутренний класс, который не является статическим

Если в вашем приложении есть вложенный класс, сделайте его статическим, потому что статические классы не требуют неявной ссылки на внешний класс. Если вы сделаете внутренний класс нестатическим, внешний класс будет активен до тех пор, пока приложение не станет активным. Если ваш класс использует много памяти, это может привести к ошибке OutOfMemoryError. В результате предпочтительнее сделать внутренний класс статическим. В Java вы должны вручную сделать внутренний класс статическим, тогда как в Kotlin внутренний класс является статическим по умолчанию. В Kotlin вам не нужно беспокоиться о статических внутренних классах.

2. Использование getContext() и getApplicationContext() неправильно()

В нашем приложении мы используем много сторонних библиотек, и большинство из них используют класс Singleton. Если вам нужно передать некоторый контекст сторонней библиотеке, выходящей за рамки текущего действия, используйте getApplicationContext(), а не getContext(). Как и в приведенном ниже примере, initialize — это статическая функция в библиотеке, которая использует контекст

9.0049

SomeLibrary

{

     object companion

     {

         initializeGeeksforGeeksLib(Content context)

         {

             это .context = context.getApplicationContext()

         }

     }

}

Некоторые библиотеки, однако, не используют вышеупомянутую запись. Таким образом, в этом сценарии он будет использовать контекст текущей активности, а ссылка на текущую активность будет сохраняться до тех пор, пока приложение не станет активным, , что может привести к ошибке OutOfMemoryError (поскольку функция инициализации является статической). В результате предпочтительнее использовать getApplicationContext() непосредственно в коде, а не полагаться на сторонние библиотеки. Вот некоторые из методов устранения OutOfMemoryError из нашего приложения. Предпочтительно писать код, который не приводит к ошибке OutOfMemoryError. Тем не менее, если ваш проект большой и у вас возникли проблемы с поиском класса, вызывающего OutOfMemoryError, вы можете использовать профилировщик памяти Android Studio, чтобы найти классы, вызывающие OutOfMemoryError.

3. Применение статического представления, контекста или действия

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

Пример: Если вы собираетесь использовать Bitmap в каком-то проекте. Этот проект будет соответствовать OutOfMemoryError на вашем мобильном устройстве, если вы используете более 10 фотографий размером 500 КБ каждая. Количество изображений, которые могут вызвать ошибку OutOfMemoryError в других ситуациях, может быть больше или меньше 10. Вы можете установить предел, добавляя фотографии в BitmapArray одну за другой, пока не получите OOM, указывающий предел устройства.

Практическое руководство по устранению ошибки OutOfMemoryError в приложении Android Если вы еще не видели OOM в своем Android-приложении, значит, в будущем он у вас появится. OutOfMemoryError появляется в Android из-за утечек памяти. Итак, чтобы удалить OutOfMemoryError, вам нужно удалить утечки памяти из вашего Android-приложения.

В этом блоге мы решим OutOfMemoryError в Android с помощью нескольких практических примеров. Итак, давайте начнем с основ утечки памяти в Android.

Что такое утечка памяти?

Когда вы запускаете какое-либо приложение на устройстве Android, система Android выделяет вашему приложению некоторую память для его работы. Все создание переменных, создание функций, создание действий и т. д. происходит только в этой памяти.

Например, , если система Android выделяет 100 МБ для вашего приложения, то ваше приложение может использовать максимум 100 МБ в определенный момент времени. Со временем, если пространство, выделенное для приложения, уменьшится или останется очень мало места, сборщик мусора (GC) освободит память, удерживаемую теми переменными и действиями, которые бесполезны. Таким образом, приложение снова получит немного места.

ПРИМЕЧАНИЕ: Сборщик мусора выполняет задачу освобождения памяти автоматически, и вам не нужно ничего для этого делать.

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

Из-за явления утечки памяти в Android мы сталкиваемся с ошибкой OutOfMemoryError в Android, потому что ваш код содержит ссылки на объекты, которые больше не требуются, и сборщик мусора не может выполнять свою работу, а ваше приложение использует все пространство, выделенное ему системой Android, и требует большего.

Какие могут быть причины ошибки OutOfMemoryError?

Существуют различные причины, которые могут привести к ошибке OutOfMemoryError в Android. Некоторые из распространенных причин утечек памяти, которые приводят к OutOfMemoryError:

  • Использование статического представления/контекста/активности
  • Регистрация и отмена регистрации слушателей
  • Нестатический внутренний класс
  • Неправильное использование getContext() и getApplicationContext()

Давайте изучим один за другим подробно.

Использование статических представлений/контекста/активности

Если вы используете статические представления/контекст/активность, у вас будет ошибка OutOfMemoryError (если ваши действия связаны с большим объемом памяти). Это связано с тем, что представление, контекст или активность будут удерживаться приложением до тех пор, пока приложение не станет активным, и из-за этого память, занятая ими, не будет освобождена сборщиком мусора.

Например, , В вашем приложении у вас есть 4 действия, то есть A , B , C и D . Деятельность « A » является вашей основной деятельностью, и вы можете открыть операцию B , C и D из A . Теперь предположим, что действия B , C и D содержат статическую ссылку на свой контекст, и каждое действие использует 2 МБ, а общая память, выделенная для приложения системой Android, составляет 4 МБ. Итак, когда активность « B «, тогда память, используемая приложением, будет 2 МБ.

Теперь вернитесь к действию » A » и запустите действие » C «. Теперь память, используемая приложением, будет 4 МБ. (2 МБ для действия B и 2 МБ для действия C ). Снова вернитесь к действию « A » и начните действие « D ». Теперь вашему приложению потребуется 6 МБ (2 МБ для B , 2 МБ). для C и 2Мб для D ), но выделенной памяти 4Мб.Так вот здесь при открытии активности « D «, вы получите OutOfMemoryError, поскольку выделенная память составляет 4 МБ, а вам требуется 6 МБ.

Давайте рассмотрим одну практическую реализацию. Здесь, в этом примере, я использую Bitmap. Используя более 5 изображений размером 1 МБ. каждый, мое приложение столкнется с OutOfMemoryError на моем мобильном устройстве.В вашем случае количество изображений, которые могут привести к OutOfMemoryError, может быть больше или меньше 5. Вы можете найти ограничение, добавляя изображения в BitmapArray одно за другим и всякий раз вы получаете OOM, это предел вашего устройства.

Итак, у моего приложения есть один MainActivity , и из этого действия я могу перейти к « ActivityB » и « ActivityC ». Оба этих действия, то есть « ActivityB » и « ActivityC », имеют статическую ссылку на свой контекст. Таким образом, пространство, используемое этими действиями, не будет удалено сборщиком мусора.

Ниже приведен код для ActivityB :

 class ActivityB: AppCompatActivity() {
    // статический контекст
    сопутствующий объект {
        lateinit var context: Контекст
    }
    val bitmapArray = ArrayList()
    
    переопределить удовольствие onCreate(savedInstanceState: Bundle?) {
        super.onCreate(сохраненныйInstanceState)
        setContentView (R.layout.activity_b)
        контекст = это
        Поток (исполняемый {
            пытаться {
                // добавляем 3 изображения в bitmapArray
                val bitmap1: Bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image1)
                val bitmap2: Bitmap = BitmapFactory.
decodeResource(getResources(), R.drawable.image2) val bitmap3: Bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image3) bitmapArray.add(bitmap1) bitmapArray.add(bitmap2) bitmapArray.add(bitmap3) } поймать (e: Исключение){ Logger.getLogger(ActivityB::class.java.name).warning(e.toString()) } }).Начало() } }

Ниже приведен код для ActivityC :

 class ActivityC: AppCompatActivity() {
    сопутствующий объект {
        lateinit var context: Контекст
    }
    val bitmapArray = ArrayList
() переопределить удовольствие onCreate(savedInstanceState: Bundle?) { super.onCreate(сохраненныйInstanceState) setContentView (R.layout.activity_c) контекст = это Поток (исполняемый { пытаться { val bitmap1: Bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image1) val bitmap2: Bitmap = BitmapFactory. decodeResource(getResources(), R.drawable.image2) val bitmap3: Bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image3) bitmapArray.add(bitmap1) bitmapArray.add(bitmap2) bitmapArray.add(bitmap3) } поймать (e: Исключение){ Logger.getLogger(ActivityC::class.java.name).warning(e.toString()) } }).Начало() } }

Итак, если вы запустите ActivityB из MainActivity , OutOfMemoryError не будет, потому что ограничение для моего мобильного устройства составляет 5 изображений, а в ActivityB я использую только 3 изображения.

Теперь вернитесь к MainActivity и запустите ActivityC , и вы получите OutOfMemoryError, потому что здесь, в ActivityC , мы используем 3 изображения, и так как мы используем статический контекст в обоих ActivityB и ActivityC , ссылка на ActivityB все еще с нами, и всего у нас есть 6 изображений (3 из ActivityB и 3 из ActivityC ), а ограничение для моего мобильного устройства составляет 5 изображений. Таким образом, произойдет OutOfMemoryError.

Чтобы устранить эту ошибку, сделайте контекст, представление или действие нестатическими.

 класс ActivityB : AppCompatActivity() {
    
    lateinit var context: Контекст
    val bitmapArray = ArrayList()
    переопределить удовольствие onCreate(savedInstanceState: Bundle?) {
        ...
    }
} 
Регистрация и отмена регистрации прослушивателей

В Android мы используем различные типы прослушивателей для прослушивания изменений, таких как изменение местоположения. Поэтому никогда не забывайте отменять регистрацию вашего слушателя, когда вы закончите использовать этот слушатель. Если вы не отменяете регистрацию прослушивателей, то прослушиватель будет присутствовать в фоновом режиме, а пространство, занятое прослушивателем, не будет удалено сборщиком мусора, даже если прослушиватель бесполезен. Таким образом, лучше отменить регистрацию прослушивателя, если он не используется. Давайте рассмотрим один практический пример.

В этом примере у нас есть один класс Singleton с именем »

SomeListener «, который будет иметь две функции, т.е. register() и unregister() . Функция register() используется для добавления действия в массив действий, а функция unregister() используется для удаления действия из массива действий. Ниже приведен код для класса Singleton:

 object SomeListener {
    private val activityArray = ArrayList()
    забавная регистрация (активность: активность) {
        ActivityArray.add (активность)
    }
    весело отменить регистрацию (активность: активность) {
        ActivityArray.remove (активность)
    }
} 

В моем мобильном устройстве, если я добавляю более 5 изображений, приложение выдает OutOfMemoryError. Итак, в этом примере у нас будет три действия, то есть MainActivity , ActivityB и ActivityC . ActivityB и ActivityC будут вызываться из MainActivity , а в функции

onCreate() обоих этих действий мы вызовем метод register() класса Singleton, чтобы добавить действия в действие множество.

Ниже приведен код ActivityB :

 class ActivityB : AppCompatActivity() {
    
    val bitmapArray = ArrayList()
    
    переопределить удовольствие onCreate(savedInstanceState: Bundle?) {
        super.onCreate(сохраненныйInstanceState)
        setContentView (R.layout.activity_b)
        Поток (исполняемый {
            пытаться {
                // добавляем 3 изображения в bitmapArray
                val bitmap1: Bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image1)
                val bitmap2: Bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image2)
                val bitmap3: Bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image3)
                bitmapArray.add(bitmap1)
                bitmapArray.add(bitmap2)
                bitmapArray.add(bitmap3)
            } поймать (e: Исключение){
                Logger.getLogger(ActivityB::class.java.name).warning(e.toString())
            }
        }).
Начало() // вызов функции register() SomeListener.register(этот) } }

Ниже приведен код ActivityC :

 class ActivityC: AppCompatActivity() {
    
    val bitmapArray = ArrayList()
    
    переопределить удовольствие onCreate(savedInstanceState: Bundle?) {
        super.onCreate(сохраненныйInstanceState)
        setContentView (R.layout.activity_c)
        Поток (исполняемый {
            пытаться {
                // добавляем 3 изображения в bitmapArray
                val bitmap1: Bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image1)
                val bitmap2: Bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image2)
                val bitmap3: Bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image3)
                bitmapArray.add(bitmap1)
                bitmapArray.add(bitmap2)
                bitmapArray.add(bitmap3)
            } поймать (e: Исключение){
                Logger.
getLogger(ActivityC::class.java.name).warning(e.toString()) } }).Начало() // вызов функции register() SomeListener.register(этот) } }

Если мы вызовем ActivityB из MainActivity , тогда будет сохранена ссылка на 3 изображения (как мы храним в классе Singleton). Здесь OutOfMemoryError не будет отображаться, потому что наш лимит составляет 5 изображений. Теперь, если мы вернемся к MainActivity и вызовем ActivityC , то мы получим OutOfMemoryError, потому что изначально у нас есть ссылка на 3 изображения, а когда

ActivityC запускается, то пришло еще 3 изображения, и в целом мы имеем ссылка на 6 изображений (поскольку мы используем один и тот же класс Singleton), и наш предел составляет 5 изображений. Итак, мы столкнемся с MemoryOutOfBoundError.

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

 override fun onStop() {
    SomeListener. unregister(это)
    супер.onStop()
} 
Вложенный класс должен быть статическим:

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

В Java вы должны сделать внутренний класс статическим самостоятельно, но в Kotlin внутренний класс по умолчанию является статическим. Таким образом, вам не нужно беспокоиться о статическом внутреннем классе в Kotlin.

Неправильное использование getContext() и getApplicationContext() в сторонних библиотеках

В нашем приложении мы используем множество сторонних библиотек, и большинство из них используют класс Singleton. Итак, если вы передаете некоторый контекст сторонней библиотеке, и эта сторонняя библиотека выходит за рамки текущего действия, используйте getApplicationContext() а не getContext() .

Как правило, в нашем приложении мы делаем следующее:

 SomeThirdPartyLibrary.initialize(this) 

Здесь initialize — это некоторая статическая функция в этой библиотеке, и она использует примерно такой контекст:

 SomeThirdPartyLibrary {
  компаньон объекта {
    инициализировать (контекст содержимого) {
       this.context = context.getApplicationContext()
    }
  }
} 

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

Таким образом, лучше использовать getApplicationContext() в вашем коде явно и не зависеть от сторонних библиотек для этого.

Вот некоторые из методов, которые можно использовать для удаления OutOfMemoryError из нашего приложения. Лучше написать код, который не выдает ошибок OutOfMemoryError. Тем не менее, если ваш проект очень большой и вам становится все труднее найти класс, ответственный за OutOfMemoryError, вы можете использовать профилировщик памяти Android Studio, чтобы найти классы, ответственные за OutOfMemoryError.

Узнайте, как использовать Android Studio Memory Profiler

Кроме того, есть одна библиотека под названием LeakCanary , которая расскажет вам о классе, ответственном за утечку памяти в вашем Android-приложении (если таковая имеется).

Подробнее о LearCanary

Заключение

В этом блоге мы узнали, как удалить OutOfMemoryError в Android. Это можно удалить, используя нестатическую ссылку на представления/контекст/активность, зарегистрировав и отменив регистрацию слушателей, используя статический внутренний класс. Итак, в будущем, если вы будете писать код для Android, я уверен, что вы будете использовать их, чтобы избежать OutOfMemoryError.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *