Android USB 配件多线程

2024-03-16

我遇到了由多线程和 Android Open Accessory 引起的问题。

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

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

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

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

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

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

  • 我尝试过获得FileDescriptor来自USBAccessory并传递到JNI在那里处理它,但在第一次读/写后,设备变得无法访问。

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

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


当您想要并行进行读取和写入时,如果读取与写入位于同一部分,则写入总是会导致读取暂停。

也许你可以遵循类似的方法ConcurrentHashMap并对不同的段使用不同的锁,并且仅当写入位于同一段上时才锁定读取,否则允许读取发生。

这会

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

希望有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android USB 配件多线程 的相关文章

随机推荐

  • 显式 int 类型作为参数

    是否可以将函数写为 void func uint64 t val template
  • 如何使用 jQuery 设置动态文本框的只读属性?

    我正在尝试从数据库值填充文本框 并且我想将文本框值设置为只读 当用户单击 编辑 选项时 将所有文本框设置为可编辑 我没能做到这一点 这是我的 HTML 代码
  • 使用 Immutable 对普通对象进行深度访问

    考虑以下示例 const stickers new OrderedMap set 1 hero batman name Bruce stickers getIn 1 gt hero batman name Bruce stickers ge
  • REST 服务返回错误的内容类型并解组

    我正在使用 RESTEasy 更具体地说 是他们框架的客户端 我正在调用第三方 Web 服务 它会返回一些 JSON 代码 但是 出于某些充分的原因 他们响应中的内容类型是 text javascript 我如何告诉 RESTEasy 它应
  • 带撇号的单词的正则表达式 (Java)

    我正在尝试找出正则表达式来匹配仅包含字母和撇号的字符串 如果一个字符串包含撇号 我只想匹配它两边都有一个字母 到目前为止我所拥有的是 a zA Z a zA Z 我想匹配如下字符串 a a aa a a aaa But not bb bb
  • 将 Service Fabric 应用程序发布到 Azure 时操作超时

    当我尝试将 Service Fabric 应用程序发布到 Azure 群集时 收到以下错误消息 3 gt Copy ServiceFabricApplicationPackage Operation timed out 3 gt At C
  • Mongodb concat int 和 string

    我正在尝试为我的集合中大小为 50 mb 及以上的所有文件投影 FileName 和 FileSize 但我无法连接 FileSize 类型 因为它的类型为 Int 我希望投影是 result id ObjectId 5652c399a21
  • 将 Python Keras NLP 模型转换为 Tensorflowjs

    我正在尝试了解有关 Tensorflowjs 的更多信息 但遗憾的是我无法将 Keras NLP 模型转换为 Tensorflowjs 这就是我想要转换的 from keras models import load model from k
  • Jqgrid 页脚文本格式问题

    在 Jqgrid 中 我已将某些列设置为链接 对于这些列 我还设置了页脚 MAX 但问题是 配置的链接也被添加到页脚值中 这是意料之外的 任何帮助表示赞赏 提前致谢 我认为问题是how您添加页脚信息 如果你使用页脚数据 http www t
  • 无法将文件从 DBFS 复制到 Databricks 中的本地桌面

    我想将文件从 dbfs 保存或复制到我的桌面 本地 我使用此命令但收到错误 dbutils fs cp dbfs username test txt C Users username Desktop Error SyntaxError un
  • 有没有办法通过 Express + Node.js 使用多个视图引擎

    Scenario 我使用开发了一些交易页面Node js http nodejs org Express http expressjs com 车把 http handlebarsjs com 作为视图引擎和MongoDB http www
  • 更新对象属性

    我正在使用 Struts 2 我的问题是我不想更新所有对象属性 因为我得到了一些敏感数据 这是我的代码示例 public class person private name private email private password 例如
  • for 循环的简写是否缓存可迭代对象的引用?

    我可能试图变得过于高效 但我一直想知道以下两个代码示例中哪一个会执行得更快 假设您有一个对包含以下内容的对象的引用ArrayList of Strings并且您想要迭代该列表 以下哪项更有效 即使效率有限 for String s foo
  • Objective-C 结构体的默认值以及如何测试

    我正在尝试测试属性是否已设置 我知道我拥有的对象 CGRect ppGoalFrame LocalPlaySetup localPlaySetup 我可以测试 if localPlaySetup nil 但如果我尝试用 nil 或 NULL
  • 实体框架如何决定是引用现有对象还是创建新对象?

    只是出于我的好奇心 以及未来的知识 Entity Framework 5 如何决定何时创建新对象与引用现有对象 我可能只是做错了什么 但似乎时不时地 如果我做一些类似的事情 using TestDB db new TestDB var cu
  • jruby - ruby​​ lambda 语法 -> 不是一个重要的考虑因素吗?

    我注意到 即使在最新的 1 6 4 jruby 版本中 也不支持 Ruby 1 9 中的新 lambda 语法 gt 所以 我猜测这种语法在 ruby 社区中并不常用 是因为语法是新的还是有其他缺点 x gt y y 1 x call 2
  • Python - 从不断变化的文本文件中实时更新图形

    我有一个线程每 2 秒连续写入一个文本文件 Matplotlib 图 实时更新图 引用同一文件 因此 当我启动脚本时 我打开一个图表并在线程上启动文件写入过程 文件正在更新 但我的图表没有更新 只有在文件写入完成后 文件上的数据才会显示在图
  • Visual Studio 2017 Update 3 - 找不到指定的 SDK“Microsoft.NET.Sdk.Web”

    Error C WebApp WebApp csproj 错误 找不到指定的 SDK Microsoft NET Sdk Web C WebApp WebApp csproj 我正在尝试打开 Dotnet 核心项目 但收到上述错误 我已经安
  • 数据库理论-两个表之间的关系

    我有一个包含两个表的数据库 让我们称它们为 Foo 和 Bar 每个 foo 可以与任意数量的 bar 相关 每个 bar 也可以与任意数量的 foo 相关 我希望能够通过一个查询检索与特定 bar 关联的 foo 以及与特定 foo 关联
  • Android USB 配件多线程

    我遇到了由多线程和 Android Open Accessory 引起的问题 我需要与 USB 附件通信 但我需要从 2 个线程进行通信 一个线程生成并发送数据 另一个线程读取数据 为什么我不使用单线程 因为在读取之前可能有 1 次或多次写