startService() вызывает зависание потока пользовательского интерфейса
В моем приложении я запускаю службу переднего плана и показываю диалог прогресса, чтобы обновить пользователя о прогрессе. На некоторых телефонах запуск службы переднего плана приводит к задержке пользовательского интерфейса на несколько секунд. Если я отключаю следующий код, пользовательский интерфейс отвечает нормально.
Код для запуска службы 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 ответ
Исправлена проблема с использованием Binder
получить подключение к услуге. По какой-то причине старые телефоны Android испытывают трудности при звонке startService()
с намерением для того же обслуживания, но другого действия.
Изменить: Похоже, что основной причиной проблемы был не сервис. Это была SharedPreferences. У нас было много .apply()
в очереди в SharedPreferences. Android, кажется, сбрасывает все эти изменения на диск, и при этом он поддерживает поток пользовательского интерфейса.
Если у вас много SharedPreferences .apply()
Затем в ожидании, если вы создаете фоновое приложение или запускаете сервис, он блокирует поток пользовательского интерфейса, поскольку сбрасывает все изменения в SharedPreferences. Я не уверен, предназначено ли это и в каких случаях Android решает это сделать.