首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android:使用IntentService实现快速数据

Android:使用IntentService实现快速数据
EN

Stack Overflow用户
提问于 2017-05-03 06:42:51
回答 2查看 209关注 0票数 2

我有一个Android应用程序,它将通过蓝牙(BLE)接收快速数据。这些数据将以50-100赫兹的频率从遥感器设备传到安卓智能手机上的专用服务(北欧nRF BLE管理器)。我想把数据,以完整的速度,交给一个单独的服务来计算它的分析。如果我使用IntentService进行分析,这意味着每10毫秒就会有意图出现。我相信每个意图都有很大的开销,我怀疑它是为这么多数据而设计的。但我所读到的一切都表明这是最简单的解决办法。这样做对吗?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-03 07:54:41

首先,你需要决定你是否需要实时行为。数据正在通过BLE实时接收,但您真的需要实时处理吗?如果您正在计算的分析不是实时需要的,那么接收数据、存储数据并在稍后处理是可以的。

如果你真的需要实时的数据处理,那么IntentService不是一个足够的设计选择。

如果您不需要实时数据处理,那么IntentService可以工作,但从性能的角度来看,它并不是最优的。

将有两个间接费用。

您自己找到的第一个目标--发送意图--会带来额外的开销,因为操作系统需要将意图“路由”到服务。

第二个将与启动和停止IntentService相关联。如果意图到达之间的时间低于onHandleIntent()返回的时间,那么系统将对每个意图启动和停止IntentService。这个开销比第一个要高得多。

因此,即使IntentService可以在这种情况下工作,IMHO也不应该使用这种方法。

解决此问题的最佳方法是使用绑定Service。从BLE接收器绑定到它,并使用常规方法调用发送数据。缺点是您需要自己实现两个特性:

  1. 阻塞需要处理的数据的队列
  2. 将处理卸载到后台线程的逻辑。

编写这个逻辑并不简单,但是如果您的应用程序是一个严肃的项目,那么它是做IMHO的唯一正确的事情。您可以从IntentService的源代码复制粘贴线程逻辑.

一个警告词:您必须知道内存消耗过大。例如:如果使用单个后台线程进行处理,且传入数据的速率高于处理速率,则队列将不断增长。在这种情况下,如果给您足够的时间,您的应用程序将出现OutOfMemory异常( IntentService也可能发生)崩溃。

如果发生这种情况,则需要执行以下任一操作:

  1. 使用多个线程进行后台处理
  2. 将数据存储到SQLite中(但SQLite会过度增长)
  3. 删除一些数据
票数 1
EN

Stack Overflow用户

发布于 2017-05-03 07:49:23

IntentService嵌入了传入意图的队列,因此,如果您处理意图的速度比它们到达的速度慢,则可以这样做。但是,我会使用HandlerThread将消息中的传入数据发布到消息中。它也嵌入了消息队列,但是没有开销,比如创建IntentService。另一种方法-使用普通服务和处理背压与RxJava库。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43752898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档