【问题标题】:Use Threads vs. Handlers vs. AsyncTask in an Android App sending UDP datagrams在发送 UDP 数据报的 Android 应用程序中使用线程、处理程序和 AsyncTask
【发布时间】:2021-07-06 22:37:54
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android sockets udp udpclient


    【解决方案1】:

    您拥有真正的混合技术,但它们并没有占据相同的位置。所以难怪你会感到困惑。

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

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

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

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

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

    【讨论】:

    • 太好了,谢谢!我还偶然发现了 Android 中的 HandlerThread,它似乎结合了 Threads、Loopers 和 Handlers。你会推荐使用什么?
    • HandlerThread 基本上是一个实用程序,可以为您启动带有 Looper 的线程。如果你打算使用 Handlers,不妨使用它,它会为你节省几行代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    相关资源
    最近更新 更多