在发送 UDP 数据报的 Android 应用程序中使用线程与处理程序与 AsyncTask

问题描述

我在开发我的第一个 Android 应用程序时有以下问题需要解决
该应用程序每秒从支持蓝牙的传感器接收约 100 个测量值。这些测量值现在应该通过网络流式传输到另一台设备。

由于传感器值应该尽快可用,我打算通过 UDP 将它们从智能手机发送到网络设备。但是,我不确定设置 UDP 套接字和发送逻辑的最佳方法是什么。

我发现了几个使用 ThreadHandlerAsyncTaskRunnable 等结构的多线程示例,但似乎没有一个示例真正适合我的问题.例如,有些似乎为每条要发送的消息生成一个线程——这对于我的应用场景来说似乎是很多不必要的开销。

我的想法是让主线程产生一个创建 UDP 套接字的子线程,并不断检查传入消息的队列,并通过 UDP 数据报在队列中发送接收到的消息。我会很高兴并感谢一些处理线程的结构可以实现这一点的指针。

解决方法

您在那里拥有真正的技术组合,但它们不会填补同一个位置。所以难怪你会感到困惑。

Runnable——这只是一个可以随时保存和调用的函数。它可能在编写解决方案时有用,但它本身不提供任何异步能力。

Handler - 处理程序是在特定线程上运行的消息队列。该线程必须设置了一个 Looper。如果你想从一个线程向另一个线程发送消息,这可以是消息传递机制,但它本身不提供异步能力。

Thread- 是一个实际的线程。它是一个可以与主线程并行运行的函数。这可能是您真正想要的。

AsyncTask- 基本上是在运行一些代码之前和之后在主线程上运行一些代码的线程。它消除了自己传递消息的负担。这是一个简化,但它是一个足够好的解释。 AsyncTasks 应该只用于 1 个快速操作。虽然您会看到它用于 HTTP 传输的示例,但它确实不应该如此。

基本上你想要的是一个用于异步部分的线程,以及一个将消息传递给该线程的方法。具有自己的 Looper 的线程和用于该 Looper 的 Handler 会很好地工作。然后线程可以从该处理程序读取消息,传感器读取代码可以将其发布到处理程序。 Thread 本身会在有工作要做时在后台运行,直到您在关闭时中断它以结束 Thread。