1.onTrimMemory
вызывается в потоке пользовательского интерфейса?
Да.Из методов docs :
..., которые отвечают на системные обратные вызовы (например, onKeyDown () для сообщения о действиях пользователя или метода обратного вызова жизненного цикла), всегда выполняются в потоке пользовательского интерфейсапроцесса.
Если вы хотите получить заверения из исходного кода, обратите внимание, что корень вызова происходит здесь ;Runnable
отправлено на ActivityThread's
основной Handler
.
2.Вызывается ли onTrimMemory
, когда активность находится на переднем плане?
Я не уверен.Документы явно не запрещают это, поэтому хорошо разработанное приложение должно допускать такую возможность.
Похоже, этот вызов в исходном коде может потенциально применяться к приложению переднего плана.
3.Если я правильно реализую onTrimMemory
(освобождая достаточно памяти), нужно ли мне беспокоиться об ошибках OOM?
Вам всегда нужно беспокоиться об ошибках OOM.Всегда можно запросить распределение больше, чем может предоставить система.Схема onTrimMemory()
отражает способ высвобождения ресурсов на основе «максимальных усилий»;нет никакой гарантии, что ваше приложение или другие пользователи в системе будут сотрудничать для достижения какого-либо определенного порога памяти.
Если ваше приложение работает в фоновом режиме, оно может не выполнять слишком много, особенно в том, что касаетсяраспределений.Может быть, это другие приложения на вашем устройстве, получающие OOM, о которых вы должны беспокоиться (если ваше приложение не может освободить «достаточно» памяти в ответ на вызов onTrimMemory()
).
4.Или onTrimMemory
вызывается только тогда, когда действие переходит в фоновый режим, поэтому OOM может по-прежнему происходить, когда приложение находится на переднем плане?
Как уже упоминалось, OOM могут появляться в любое время, когда вы пытаетесь выделить место.Надеемся, что другие приложения на вашем устройстве сделают все возможное, чтобы уменьшить потребление памяти (после включения onTrimMemory()
), чтобы максимальное количество ресурсов было доступно для вашего приложения переднего плана.Если они этого не сделают, они, вероятно, будут прерваны (как вы можете видеть из логики в ActivityManagerService.java), что освобождает еще больше ресурсов.
Система сделает все возможное, чтобы обеспечитьПриложение переднего плана имеет ресурсы, которые оно запрашивает.Тем не менее, вы должны разумно планировать использование памяти и иметь возможность корректно восстанавливаться в случае ошибок (OOM).