starterVice()导致UI线程冻结



在我的应用程序中,我正在启动前景服务并显示进度对话框以更新进度的用户。在某些手机上,启动前景服务会导致UI滞后几秒钟。如果我禁用以下代码,则UI响应正常。

启动服务的代码是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);

第一个启动服务的呼叫后,顺序呼叫不要冻结UI。任何洞察力都将不胜感激!

通过使用Binder获得与服务的连接来修复问题。由于某种原因,较旧的Android手机在致电startService()时用相同服务的意图但不同的动作而挣扎。

编辑:看来问题的主要原因不是服务。这是共享流程。我们在共享流程中排队了很多.apply()。Android似乎将所有这些更改都冲向磁盘,并且在这样做时会构成UI线程。

如果您有很多共享preferences .apply()待定,则如果您背景应用程序或启动服务,则它会阻止UI线程将所有更改转换为共享Preferences。我不确定这是否是故意的,并且在哪些情况下Android决定这样做。

最新更新