安卓 USB 配件多线程

2022-09-04 23:22:35

我有一个由多线程和Android开放配件引起的问题。

我需要与 USB 配件通信,但我需要从 2 个线程进行通信。一个线程生成并发送数据,另一个线程读取数据。

  • 为什么我不使用单个线程?因为在读取之前可以有 1 次或多次写入,并且读取被阻止,所以这不是一个选项。

  • 如果使用多个线程,我迟早会遇到“I / O错误(没有这样的设备)”,因为我会同时执行读取和写入之间发生冲突。

  • 锁定或多或少会让我回到单线程的情况下,所以不好。

  • .available()不支持返回的方法,因此我无法在执行读取之前检查是否有任何可用内容input-stream

  • 由于它不是基于套接字的流,因此我也无法设置超时。

  • 我尝试从中获取并传递到那里处理它,但是在第一次读/写之后,设备变得无法访问。FileDescriptorUSBAccessoryJNI

需要的问题/建议:
对此的建议/最佳实践方法是什么?我不期望编写代码,我只需要一些关于如何处理这个问题的指导。

澄清一下:
另一端的软件可能会或可能不会使用任何数据进行响应。有一些所谓的静默发送是刚刚收到但又没有ACK的数据。由于我正在开发的应用程序只是一个代理,因此我没有清晰的了解数据是否会产生答案。这也需要对数据进行分析,而目前还没有这方面的数据。


答案 1

由于您希望并行读取和写入,如果读取与写入位于同一部分,则写入将始终导致暂停读取。

也许您可以遵循类似的方法,对不同的段使用不同的锁,并且如果写入在同一段上,则只锁定只读,否则允许读取发生。ConcurrentHashMap

这将

  1. 在大多数情况下,避免在写入期间阻塞读取
  2. 避免碰撞和
  3. 绝对不会是单线程方法。

希望有所帮助。


答案 2

如果使用多个线程,我迟早会遇到I / O错误(没有这样的设备),因为我会同时执行读取和写入之间发生冲突。

这说明了一切。由于您在不支持并发访问的同一通道上执行读取和写入操作,因此需要让线程等待,直到另一个线程完成读/写操作。

你的双线程方法或多或少是我会做的。祝你好运,相信自己。


推荐