在后台发送大量数据

问题描述:

我目前正在开发一款应用程序,它可以让用户通过UDP将传感器数据发送到OSC receiver,没有恶意,用户完全掌控一切。在后台发送大量数据

当用户启用数据发送时,如果用户启用此传感器和轴进行传输,则每个传感器更改事件都会触发分组的分派。

这可能导致大量数据发送,例如,如果用户想用他的手机中的很多参数来控制合成器(想想鼓点声音是通过跳跃来触发的,而你的空间方向改变了音色)。

我现在已经测试了以下的方法,但是每个人都有不同的Android版本的缺点和/或崩溃:

  1. 使用AsyncTask<String, Void, Boolean>doInBackground(String... strings)发送数据。这种方法的缺点是在Android 2.3.3中可能有java.util.concurrent.RejectedExecutionException,因为这可能会创建太多的线程。使用IntentService并发送数据onHandleIntent(Intent intent)。这种方法的缺点是Android 2.3.3中的一个缓慢且无响应的用户界面。
  2. 使用绑定Service并发送有关服务的暴露功能的数据。这在Android 2.3.3上就像是一个魅力,但是在Android 4.4.4上崩溃的时候是android.os.NetworkOnMainThreadException

还有其他的可能吗?在限制Service中运行AsyncTask<>是否会遇到两种异常中的任何一种?

为什么不使用单个线程而不是AsyncTask?有一个等待数据发布到它的事件循环,然后将数据发送到服务器?基本上,它的一个AsyncTask永远不会结束并睡觉,直到数据发布到它。这个线程可以由一个活动或服务拥有,无论哪个对你来说都合情合理。

顺便说一句,你的这个应用程序会杀死你的电池。但我怀疑你知道这一点,并确定它。

+0

我为此使用了一个自定义的'HandlerThread'和一个自定义的'Handler'类。一个小小的后续行动:“杀死”电池意味着在这方面“排水”,对吧? – Residuum 2015-03-31 00:40:34

+0

是的。频繁使用无线电发送数据会耗尽大量电量。由于完全充电可能会在几个小时内完成,具体取决于设备的电池有多大。如果您的应用程序仍然有效,您可能需要批量处理数据并每隔几分钟发送一次。 – 2015-03-31 00:42:17

+0

在这种情况下,排水是可以的,但“杀死”电池可能具有破坏电池的含义。以后收集和发送数据不是一种选择,因为应用程序应该用于实时控制软件合成器。 – Residuum 2015-03-31 00:53:06