Поддерживать AsyncTask в условиях низкой памяти? - PullRequest
3 голосов
/ 22 августа 2010

Я написал виджет домашнего экрана как ImageView, т.е.код генерирует весь виджет и записывает его в RemoteViews как растровое изображение.На более медленных устройствах с низким объемом памяти, таких как мой G1, генерация растрового изображения может занять пару секунд, и чтобы избежать страшного принудительного закрытия, я переместил весь графический код в AsyncTask.Пока все хорошо.

Однако в условиях очень низкого объема памяти AsyncTask может быть легко убит ОС до того, как он закончит генерировать растровое изображение, что приведет к появлению пустого квадрата на домашнем экране.Поэтому, перед созданием AsyncTask, он устанавливает будильник на + 5 секунд, а после завершения графики сбрасывает будильник.Здесь предполагается, что если сигнал тревоги сработал, более чем вероятно, что процесс был прерван, и мы должны установить еще один сигнал тревоги +5 и запустить его снова.

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

У меня такой вопрос: это лучший способ?Есть ли какой-нибудь способ (вежливо) попросить ОС не убивать AsyncTask до его завершения (на том основании, что его уничтожение фактически приведет к более растрате системных ресурсов)?

IСледует понимать, что если процесс относится к категории «видимых», то Android не убьет его, кроме как в крайнем случае.Но я не знаю, как пометить AsyncTask как «видимый».Я очень рад за процесс, который будет убит, как только закончится рисование виджета.Просто хотел бы остаться в живых достаточно долго, чтобы завершить.

Ответы [ 3 ]

1 голос
/ 13 февраля 2014

Используйте EmptyService, связавшись с ним и отменив привязку, как только работа будет завершена, см. https://github.com/android/platform_packages_providers_calendarprovider/blob/master/src/com/android/providers/calendar/EmptyService.java. Я не уверен, гарантирует ли это, что ваш процесс не будет убит или просто уменьшает шансыего убивают.

Вы также можете использовать службу переднего плана, но вам нужно будет предоставить ей уведомление в строке состояния, см. http://developer.android.com/guide/components/services.html#Foreground.

Или вы можете использовать IntentService, как предложил @Mike;хотя я не вижу в документации, что «он получает тот же приоритет уничтожения, что и приоритетная задача».

0 голосов
/ 22 июля 2013

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

Кроме того, служба выполняет ту же функцию, что и асинхронная.

Как только вы закончите работу, закройте службу.

0 голосов
/ 05 сентября 2010

Рассматривали ли вы использование IntentService для этого? Пока ваш сервисный код выполняется, он получает тот же приоритет уничтожения, что и приоритетная задача. У него не будет достаточно тесной связи с виджетом, как у AsyncTask, но я думаю, что это увеличит шансы на завершение вашего кода.

...