【问题标题】:User tracking and data sending in a background service in AndroidAndroid后台服务中的用户跟踪和数据发送
【发布时间】:2012-11-16 13:41:57
【问题描述】:

详情

应用启动时有一个后台服务正在运行。在此服务中,onStartCommand() 开始使用读取之间通过的米的参数侦听 GPS 位置。比如说50米。每次读取位置时都会发生以下操作:

  • 读取位置存储在本地数据库中
  • 从数据库中检索所有未发送的位置
  • 位置被发送到网络服务器
  • 如果发送成功,则从数据库中删除位置

现在,每次读取位置时都会发生这种行为。用户可能正在步行,这需要一些时间才能达到 50 米或快速行驶,而可以完成许多读取,并且数据库插入/检索中的事情可能会变得混乱。因此,主要请求之一是按顺序处理所有读取位置,因为它们被读取。类似于:读取位置 1,插入,发送...读取位置 2,插入,发送。

我找不到合适的方法来做到这一点。如您所知,服务与应用程序在同一个主线程中运行,因此我肯定需要使用线程来保持 UI 运行顺畅。

我正在考虑使用 ExecutorService 和 Executors.newSingleThreadExecutor() 来在每次读取位置时向其提交新线程。通过这种方式,我确保处理是按顺序完成的,但是……我为每次读取创建新线程,这可能不是一件好事。

对于这种情况,您会建议什么最佳方法?

【问题讨论】:

  • 是的,使用 ExecutorService & Executors.newSingleThreadExecutor() .... 或者将所有内容包装在 asynctasks 中

标签: android service thread-safety threadpool


【解决方案1】:

我要做的是删除服务并在每次读取位置时抛出IntentService

您可以将requestLocationUpdates 与待定意图参数一起使用,并将待定意图参数设置为触发您的意图服务的意图。

在 intentservice 的 onHandleIntent 中,您可以处理位置更新。 Intent 由 Intent 服务按顺序处理,并在单独的线程中处理它们(然后过期)。

如果你只需要在后台消费一个镜头事件,intentservice 是一种更紧凑、更合适的解决方案。

【讨论】:

  • 我确实需要使用后台服务来不断跟踪位置。但是,你的想法听起来很有趣。所以让我看看我是否明白了:在我的服务中,每次读取位置时,我需要做的就是启动意图服务并将读取的位置传递给它。 onHandleIntent 中的这个意图服务会将当前作业添加到工作队列中。因此,每次读取位置时,都会将位置处理添加到此工作队列中。处理完第一个位置后,意图服务不会关闭吗?
  • 简单多了。如果您将待处理的意图设置为触发您的意图服务的意图,您的意图服务将被免费触发。这种类型的每个意图都放在一个队列中,并由意图服务在一个单独的线程中处理。当 onHandleIntent 返回时,意图服务终止。您需要担心的只是业务逻辑。
  • 你需要使用 public void requestLocationUpdates (long minTime, float minDistance, Criteria criteria, PendingIntent intent)(带有pendingintent参数的那个)
  • 抱歉,我无法编辑以前的 cmets。监控位置变化是什么意思?如果您正确设置监听器,则每次位置更改时都会触发一个意图。我认为您想按顺序处理更改,因此您可以使用 intentservice 来做到这一点
  • 我已经更新了我的代码以使用 IntentService,它似乎运行良好。有趣的是,所有 Intent 都是一个接一个的句柄,尽管它们是异步的。很好的答案,感谢您的帮助。我将继续测试并返回最终结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多