startService () вызывает зависание потока пользовательского интерфейса - PullRequest
0 голосов
/ 25 апреля 2018

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

Код для запуска службы: applicationContext.startService(FirmwareUpdateService.createUpdateActionIntent(applicationContext, progress));

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

Если я прокомментирую логику внутри службы (показывает только уведомление на переднем плане), это не имеет значения.

private void createUpdateNotification(int progress) { return new Notification.Builder(this) .setContentTitle(getString(R.string.updating)) .setProgress(MAX_PROGRESS, progress, false) .setSmallIcon(R.drawable.push_notif_icon) .build(); }

Notification notification = createUpdateNotification(progress); startForeground(NOTIFICATION_ID, notification);

Послепервый вызов для запуска службы, последовательные вызовы не замораживают пользовательский интерфейс.Любое понимание приветствуется!

1 Ответ

0 голосов
/ 26 апреля 2018

Исправлена ​​проблема с использованием Binder для подключения к услуге.По какой-то причине старые телефоны Android испытывают трудности при вызове startService() с намерением использовать ту же услугу, но с другим действием.

Редактировать: Похоже, что основной причиной проблемы был не сервис.Это была SharedPreferences.У нас было много .apply() в очереди в SharedPreferences.Похоже, что Android сбрасывает все эти изменения на диск и при этом поддерживает поток пользовательского интерфейса.

Если у вас много ожидающих SharedPreferences .apply(), тогда, если вы создадите фоновое приложение или запустите его.блокирует поток пользовательского интерфейса, поскольку он сбрасывает все изменения в SharedPreferences.Я не уверен, предназначено ли это и в каких случаях Android решает это сделать.

...