【问题标题】:startService() causing UI Thread to FreezestartService() 导致 UI 线程冻结
【发布时间】:2018-10-06 09:13:49
【问题描述】:

在我的应用程序中,我正在启动一个前台服务并显示一个进度对话框来更新用户的进度。在某些手机上,启动前台服务会导致 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。任何见解都值得赞赏!

【问题讨论】:

  • 在第一次调用启动Service 时,会调用Service 的构造函数,并在Service 中调用onCreate()。您是否有任何可能需要大量时间的代码?
  • @DavidWasser 我们唯一的代码在onStartCommand(),它是显示如上所示的通知。
  • 把代码贴在createUpdateNotification()
  • @DavidWasser return new Notification.Builder(this) .setContentTitle(getString(R.string.updating)) .setProgress(MAX_PROGRESS, progress, false) .setSmallIcon(R.drawable.push_notif_icon) .build();
  • 以后不要把代码放在注释里。您可以编辑您的原始问题并在那里添加代码。它更容易阅读。

标签: android android-service ui-thread foreground-service


【解决方案1】:

通过使用Binder 来获得与服务的连接来解决此问题。出于某种原因,较旧的 Android 手机在使用 Intent 调用 startService() 以获得相同的服务但​​不同的操作时会遇到困难。

编辑: 看起来问题的主要原因不是服务。这是 SharedPreferences。我们有很多 .apply()s 在 SharedPreferences 中排队。 Android 似乎会将所有这些更改刷新到磁盘,并在此过程中阻止 UI 线程。

如果您有很多 SharedPreferences .apply()s 待处理,那么如果您在后台运行应用程序或启动服务,它会阻塞 UI 线程,因为它会将所有更改转储到 SharedPreferences。我不确定这是否是有意的,以及 Android 决定在什么情况下这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-02
    • 2010-09-20
    • 1970-01-01
    • 2011-06-22
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多