【问题标题】:Sending a lot of data in background在后台发送大量数据
【发布时间】:2015-03-30 22:57:49
【问题描述】:

我目前正在开发一个应用程序,它允许用户通过 UDP 将传感器数据发送到 OSC receiver,没有恶意,用户可以完全控制一切。

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

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

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

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

还有哪些其他可能性?在绑定的Service 中运行AsyncTask<> 不会遇到这两个异常中的任何一个吗?

【问题讨论】:

    标签: android android-asynctask android-service


    【解决方案1】:

    为什么不使用单个线程而不是 AsyncTask?有一个事件循环等待数据发布到它,然后将数据发送到服务器?基本上它是一个 AsyncTask,在数据发布到它之前永远不会结束并休眠。该线程可以由 Activity 或 Service 拥有,无论哪个对您有意义。

    顺便说一句,你的这个应用程序会耗尽你的电池。但我怀疑你知道这一点并且可以接受。

    【讨论】:

    • 我为此使用了自定义 HandlerThread 和自定义 Handler 类。一个小的后续行动:“杀死”电池在这种情况下意味着“耗尽”,对吧?
    • 是的。频繁使用无线电发送数据会消耗大量电池。充满电可能需要几个小时,这取决于他们的设备有多大的电池。如果您的应用仍然可以运行,您可能需要批量处理数据并每隔几分钟发送一次。
    • 在这种情况下排水是可以的,但是“杀死”电池可能具有破坏电池的含义。稍后收集和发送数据不是一种选择,因为应用程序应该用于实时控制软件合成器。
    • 那你应该没问题。需要明确的是,对电池的损坏不会比正常使用电池造成的损坏更多。这只是意味着您必须尽快将其插入,并且您将有更多的充电周期(这可能会稍微缩短电池寿命,但我们不是在谈论它突然死亡或爆炸)。
    猜你喜欢
    • 2011-04-25
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 2012-10-19
    相关资源
    最近更新 更多