2012-11-28 174 views
0

详细用户跟踪和数据在Android中

应用程序有当应用程序启动一个后台服务运行在后台服务发送。在这项服务中,onStartCommand()开始使用读取之间传递的参数的参数来侦听GPS位置。比方说50米。每一个位置阅读下面的操作时有发生:

  • 读取位置存储在本地数据库
  • 从数据库
  • 位置(一个或多个)发送到Web服务器检索所有未发送的位置
  • 如果发送成功,位置(一个或多个)从数据库

现在这种行为发生的每一次位置read.The用户可能行走这需要一些时间,使50米或删除驱动速度很快,而许多读取操作可能会完成,而且数据库插入/检索操作可能会变得麻烦。因此,其中一个主要要求就是在读取它们时顺序处理所有读取位置。就像:读取位置1,插入它,发送它...读取位置2,插入它,发送它。

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

我想使用的ExecutorService和Executors.newSingleThreadExecutor()到每一个位置的读取时间提交新的线程。通过这种方式,我确保处理是按顺序完成的,但是......我为每次读取创建新线程,这可能不是什么好事。

对于这种情况,你会建议什么最好的方法?

+0

是的,使用ExecutorService&Executors.newSingleThreadExecutor()....或者将所有东西包装在async服务器中 – petey

回答

1

我会做的就是删除该服务并抛出IntentService每一个位置读取时间。

您可以使用requestLocationUpdates意图的说法之前,并与触发你的意图服务的意图的待定意图的说法。

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

如果你只需要消耗的背景一次性事件,intentservice是更紧凑,更适合的解决方案。

+0

我确实需要使用后台服务来持续跟踪位置。但是,你的想法听起来很有趣。所以,让我看看是否让事情变得更加直观:在我的服务中,每次读取位置时,我所需要做的就是启动意向服务并将读取位置传递给它。这个意图服务在'onHandleIntent'中将当前作业添加到工作队列中。因此,每次读取位置时,都会在此工作队列中添加位置处理。第一个地点处理后,意向服务不会关闭吗? – Alin

+0

这简单得多。如果您使用意图触发您的intentservice设置了挂起的意图,则您的intentservice将被免费触发。这种类型的每个意图都放入一个队列中,并由意向服务在一个单独的线程中处理。意图服务在onHandleIntent返回时死亡。你需要担心的只是业务逻辑。 – fedepaol

+0

您需要使用public void requestLocationUpdates(long minTime,float minDistance,Criteria criteria,PendingIntent intent)(具有pendingintent argumetn的那个) – fedepaol