【问题标题】:Replacing my (resource intensive) service替换我的(资源密集型)服务
【发布时间】:2017-09-19 09:13:02
【问题描述】:

我有一个应用程序可以在通知中显示新数据。该数据由网络设备提供。我可以查询此设备并将其与我的服务中的缓存数据进行比较,以确定是否需要更新通知。我的应用程序有一个服务,它具有缓存数据的局部变量。如果设备有更新的数据,我会在通知中显示给用户。现在我开始收到 IllegalStateException ,因为 Android O 不允许在应用程序处于后台模式时调用 startService() 。我知道我可以在前台模式下启动服务,但由于 Android 提供的资源密集型方式较少,我想尝试一些新的东西。除了缓存在本地变量中的数据之外,它还存储在 Firebase 数据库中。

我的要求:

  1. 每 10 秒检查一次(如果屏幕打开)是否有新数据
  2. 开机时检查是否有新数据
  3. 如果有新数据,更新通知
  4. 需要长时间运行并能够将新数据与旧数据(缓存或来自 Firebase)进行比较。
  5. 可以在应用处于后台模式时运行

我的想法: 我查看了 Firebase 作业调度程序 (https://github.com/firebase/firebase-jobdispatcher-android#user-content-firebase-jobdispatcher-)。也许我可以将它配置为每次打开屏幕时运行,每 10 秒运行一次,以从网络设备检索新数据并将其与 Firebase 数据库中的数据匹配。但是,经常查询数据库可能会花费很多性能。

【问题讨论】:

  • 但是经常查询数据库可能会消耗很多性能。你不是已经这样做了吗?
  • 不,目前服务在局部变量中包含所有数据,我需要确定是否有新数据。它还包含通知所需的所有数据。只有当局部变量中的缓存数据过期时,数据才会在数据库中更新,当然在局部变量中也是如此。
  • 所以你的问题是,由于jobdispatcher不是一个长期运行的服务,你的缓存将被迅速失效,导致你不得不经常重新获取数据?
  • 没错。我认为我不能像在服务中那样将数据缓存在 jobdispatcher 中。该服务可以将数据缓存数小时甚至数天。
  • 您是否研究过缓存数据的替代方法?

标签: android android-service firebase-job-dispatcher


【解决方案1】:

尝试基于对象的数据库,如 Realm、SnappyDB(Uber 使用它)等。 查询速度超级快

【讨论】:

  • 感谢您的想法,但我将继续使用 Firebase 数据库。我喜欢实时功能,性能很棒。我通过实现一个 Firebase 作业调度程序来解决我的问题,该调度程序将我的服务提升到前台,并且该服务保持与我的网络设备的连接以及通知所需的对象。
【解决方案2】:

通过保留我的服务解决了这个问题。 Android Oreo 迫使我以不同的方式使用这项服务。只是一个简短的描述,以防有人需要它:

  1. 只要可以连接到网络设备,我的服务就会进入前台模式。
  2. 无法连接到网络设备时服务停止。同时安排了 Firebase Jobdispatcher 作业。
  3. 当 jobdispatcher 运行作业时,它会查看是否可以连接到设备。如果为 true -> 服务将启动并将其自身提升到前台。
  4. 该服务仍保持与网络设备的连接并持有通知所需的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 2018-06-15
    • 2012-05-18
    相关资源
    最近更新 更多