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

Use Threads vs. Handlers vs. AsyncTask in an Android App sending UDP datagrams

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

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

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

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

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

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

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

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

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

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