在android中后台收集和保存大量数据的最有效方法

时间:2016-09-01 16:18:30

标签: android multithreading save

我正在构建一个Android应用程序,它接受来自各种不同传感器(总共5个)的数据,每个传感器都提供加速度和速度。陀螺仪,还有一个发送EMG数据。这种情况发生在蓝牙v4.1上,频率约为50Hz。

我需要在后台收听所有这些传感器并保存数据。

我想知道:

1)将数据保存到磁盘的最有效方法是什么?

作为参考,所有传感器的所有数据均为每小时约23Mb。我应该不断地将数据保存在文件中(我怀疑它),每小时等等吗?以文本形式对数据进行数据处理是否便宜,或者我应该将其保存为大型浮点数组还是什么?

2)处理此类后台任务的最有效方法是什么?

这方面似乎有相当多的讨论。我读过以下课程:

  • 服务
  • IntentService
  • HandlerThreads
  • 的AsyncTask
  • 线程池

我真的不清楚我应该使用哪一种这类工作。如果比我更开明的人能发表评论,我将非常感激。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

对于您的第一个项目,您显然需要判断一下,如果应用因某种原因而被停止,您愿意承担多少数据。在缓冲区中保存数据的时间越长,崩溃中丢失的数据就越多。我没有看到任何理由在您获取数据时不将数据附加到文件中。

至于决定数据的最佳格式,需要考虑的一些事项是:

  • 您将对数据做些什么?某些格式(CSV文本,JSON等)将比其他格式更易于您的下游进程使用。
  • 如果您在获取数据时尝试写出数据,那么您可能希望尽量减少所需的预处理量。
  • 某些格式(例如基于XML的格式)在空间方面的效率远低于其他格式。最小的可能是二进制格式。

在稍微解决第二项时,如果您希望流程在后台继续工作,则两个服务项很有用;否则你的应用程序必须保持在最前沿。由于你的运行时间很长,你可能想要使用IntentService。

其他项目只是在与主线程分开的线程上运行事物的不同方法。 AsyncTask使您可以轻松运行需要进度反馈的内容以及您希望使用最终结果更新GUI的位置。

处理程序可以在其他线程上运行,但通常只用于在主线程上的不同时间运行东西。这是通过将(可选延迟的)消息发布到消息队列来完成的。

ThreadPool和其他线程构造的级别要低得多。这是一种自己动手操作的方法,您可以在其中进行更精细的控制,但必须手动完成大部分的内务工作。

有两个有用的网页是Processes and ThreadsAndroid Thread Constructs (Part 4): Comparisons