UI Thread 和运行 TCP Client 的 Worker 线程之间的持续数据传输

Posted

技术标签:

【中文标题】UI Thread 和运行 TCP Client 的 Worker 线程之间的持续数据传输【英文标题】:Continuous data transmission between UI Thread and Worker thread running TCP Client 【发布时间】:2020-07-27 13:45:01 【问题描述】:

我有一个应用程序 (android Studio),它可以根据用户触摸连续生成数据(操纵杆坐标),我想使用 Socket 编程将其连续流式传输到我的 NodeMCU。我实现了一个异步任务以在单独的步骤上执行此操作。

我通过 Main Activity 的 execute() 方法将数据字节传递给 AsyncTask。 doInBackground 方法打开套接字连接并将数据字节传输到服务器,然后关闭套接字。随着下一个可用的用户输入,这个过程再次重复。现在由于显而易见的原因,这不是很有效。

我还没有想出一种方法来将字节从 Main Activity 流式传输到单独线程上的缓冲区,这反过来又会继续将字节流式传输到 NodeMCU 而不会重复关闭套接字。

所以问题来了。我的问题的最佳解决方案是什么?我一直在阅读很多不同的东西,比如服务、线程、Loopers、RxJava,但我似乎无处可去。

【问题讨论】:

你签出socket.io了吗? 你好@SIMMORSAL:我尝试了 Websockets 解决方案。效果很好。我想我会在未来的某个时候尝试 TCP 和 UDP 协议。但现在,我可以专注于项目的其他部分。 【参考方案1】:

我的偏好是:

    RxJava - 因为 RxJava 非常酷,解决了很多问题,比如在 UI 和 IO 之间切换调度程序,并且接近你的领域。将您的操纵杆设备想象成一个不断发射事件的 Observable(这正是 RyJava 的优势所在)。 服务 - 可以高效完成。它将归结为服务提供的观察者模式。在 Android 中,通过服务公开一些硬件是很常见的。 循环器 - 因为它们比线程更轻量级且更易于管理。 线程 - 可能,但可能大部分工作都由您自己完成,并且最有可能产生细微的错误。

【讨论】:

感谢您的回复。如果我使用 Loopers 或 Threads,如何打开套接字连接并使其保持打开状态?他们没有 onCreate() 方法。

以上是关于UI Thread 和运行 TCP Client 的 Worker 线程之间的持续数据传输的主要内容,如果未能解决你的问题,请参考以下文章

WIFI模块开发教程之W600网络篇1:AP模式下TCP Client通信

Android:异步处理之Handler+Thread的应用

java thread.sleep 也让 swing ui 进入睡眠状态

java thread.sleep 也让 swing ui 进入睡眠状态

AsyncTask 和 Thread 区别

Android:异步处理之Handler+Thread的应用