我有一个Android应用程序,它将通过蓝牙(BLE)接收快速数据。这些数据将以50-100赫兹的频率从遥感器设备传到安卓智能手机上的专用服务(北欧nRF BLE管理器)。我想把数据,以完整的速度,交给一个单独的服务来计算它的分析。如果我使用IntentService进行分析,这意味着每10毫秒就会有意图出现。我相信每个意图都有很大的开销,我怀疑它是为这么多数据而设计的。但我所读到的一切都表明这是最简单的解决办法。这样做对吗?谢谢。
发布于 2017-05-03 07:54:41
首先,你需要决定你是否需要实时行为。数据正在通过BLE实时接收,但您真的需要实时处理吗?如果您正在计算的分析不是实时需要的,那么接收数据、存储数据并在稍后处理是可以的。
如果你真的需要实时的数据处理,那么IntentService不是一个足够的设计选择。
如果您不需要实时数据处理,那么IntentService可以工作,但从性能的角度来看,它并不是最优的。
将有两个间接费用。
您自己找到的第一个目标--发送意图--会带来额外的开销,因为操作系统需要将意图“路由”到服务。
第二个将与启动和停止IntentService相关联。如果意图到达之间的时间低于onHandleIntent()返回的时间,那么系统将对每个意图启动和停止IntentService。这个开销比第一个要高得多。
因此,即使IntentService可以在这种情况下工作,IMHO也不应该使用这种方法。
解决此问题的最佳方法是使用绑定Service。从BLE接收器绑定到它,并使用常规方法调用发送数据。缺点是您需要自己实现两个特性:
编写这个逻辑并不简单,但是如果您的应用程序是一个严肃的项目,那么它是做IMHO的唯一正确的事情。您可以从IntentService的源代码复制粘贴线程逻辑.
一个警告词:您必须知道内存消耗过大。例如:如果使用单个后台线程进行处理,且传入数据的速率高于处理速率,则队列将不断增长。在这种情况下,如果给您足够的时间,您的应用程序将出现OutOfMemory异常( IntentService也可能发生)崩溃。
如果发生这种情况,则需要执行以下任一操作:
发布于 2017-05-03 07:49:23
IntentService嵌入了传入意图的队列,因此,如果您处理意图的速度比它们到达的速度慢,则可以这样做。但是,我会使用HandlerThread将消息中的传入数据发布到消息中。它也嵌入了消息队列,但是没有开销,比如创建IntentService。另一种方法-使用普通服务和处理背压与RxJava库。
https://stackoverflow.com/questions/43752898
复制相似问题