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 решает это сделать.

Другие вопросы по тегам