【问题标题】:Is requestForLocationupdates a blocking call in Android?requestForLocationupdates 是 Android 中的阻塞调用吗?
【发布时间】:2022-02-11 23:47:55
【问题描述】:

我想每 5 分钟更新一次位置,直到应用程序的生命周期。我知道如何更新位置。我想知道的是 requestForLocation 是否是阻塞调用。

我可以在 Service 类中执行此操作,但 Service 仅在主线程上运行,而且 Service 可以随时被系统停止。我不希望这种情况发生。位置更新应该一直有效,直到应用程序在内存中。如果应用程序本身被杀死,那么显然服务也会被杀死。

实现这一点的方法应该是什么?

【问题讨论】:

    标签: android location updates


    【解决方案1】:

    我想知道 requestForLocation 是否是阻塞调用。

    Android 中没有名为 requestForLocation()requestForLocationUpdates() 的方法。如果你的意思是requestLocationUpdates(),这不是阻塞调用。

    我不希望这种情况发生。

    用户和操作系统有权随时终止您的服务。在这种情况下,这是一件好事,因为您提出的计划浪费了 RAM 而没有任何好处。

    实现这一点的方法应该是什么?

    使用AlarmManager 和类似于我的LocationPoller 的服务,这样您就可以获取您的位置数据,对其进行处理,然后关闭直到下一个周期到来。

    另外,请允许您的用户配置投票周期,包括“不投票”选项。

    【讨论】:

    • 在 locationpoller 示例中,您将位置更新参数设置为 0,并在收到位置后删除 locationlistener。此外,该示例仅使用 NETWORK_PROVIDER。我想在可用时使用 GPS_PROVIDER,仅在 GPS 不可用时才切换到 NETWORK_PROVIDER。与其在这里使用 AlarmManager 的方式,不如使用 requestLocationUpdates() 并指定 5 分钟以获得下一次更新。
    • @sunil: "与其在这里使用 AlarmManager 的方式,不如使用 requestLocationUpdates() 并指定 5 分钟获取下一次更新。" - 不。首先,提供给requestLocationUpdates() 的时间参数是一个提示,而不是规则,您可能会比这更快地得到修复。其次,这种模式迫使您尝试(并且失败)始终将服务保留在内存中,始终保持 GPS 开启,这将导致您的用户成群结队地抛弃您,并在市场上给您一星评级将他们的设备电池寿命缩短到几个小时。
    • @sunil:第三,如前所述,你不能成功地将服务无限期地保存在内存中,因为用户和操作系统会摆脱你——在 GPS 开启的情况下,操作系统可能会在由于上述电池消耗,只需半小时。
    • 非常感谢。我会尽量按照你的建议去做。
    • 即使只使用 NETWORK_PROVIDER 也会耗尽电池电量。我猜 NETWORK_PROVIDER 适用于位置信息不是那么重要的应用。
    【解决方案2】:

    出于某种原因,这个requestLocationUpdates() 电话确实会阻塞,至少在我测试的手机品牌中是这样。修复它的方法是使用它的重载之一。请在another post 中查看此答案。

    【讨论】:

      猜你喜欢
      • 2019-09-16
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多