From 8afa99c69d631088a5bd63f1f728ec48e31bcc4d Mon Sep 17 00:00:00 2001 From: leon <916117771@qq.com> Date: Thu, 16 Jul 2026 09:13:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(serial):=20=E4=BC=98=E5=8C=96CH934x?= =?UTF-8?q?=E4=B8=B2=E5=8F=A3=E5=86=99=E5=85=A5=E6=80=A7=E8=83=BD=E5=B9=B6?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A4=9A=E8=AE=A4=E8=AF=81=E5=B9=B6=E5=8F=91?= =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 引入独立写执行器池确保同端口有序不同端口可并发 - 将同步写操作改为异步执行避免UI线程阻塞 - 实现认证UI协调器防止身份验证与告警覆盖层冲突 - 添加嵌套单用户认证状态快照管理机制 - 修复双人验证中用户身份一致性检查逻辑 - 优化抽屉信息轮询批量请求提升响应效率 - 修复管理账户权限组关联关系初始化问题 - 调整轮询间隔参数提高系统响应性 --- .../ch934x_serial/Ch934xSerialPlugin.java | 56 ++++++++++++++----- 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/android/src/main/java/com/xiarui/ch934x_serial/Ch934xSerialPlugin.java b/android/src/main/java/com/xiarui/ch934x_serial/Ch934xSerialPlugin.java index 3728831..4795234 100644 --- a/android/src/main/java/com/xiarui/ch934x_serial/Ch934xSerialPlugin.java +++ b/android/src/main/java/com/xiarui/ch934x_serial/Ch934xSerialPlugin.java @@ -21,6 +21,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import cn.wch.ch934xlib.CH934XManager; @@ -84,6 +86,22 @@ public class Ch934xSerialPlugin implements FlutterPlugin, MethodCallHandler, Act /** Modem 状态位缓存(CTS/DSR/RI/DCD)。SDK 仅以回调方式推送,这里聚合最近一次。 */ private int modemStatusCache = 0; + /** 每个串口独立的单线程写执行器:同端口有序,不同端口可并发。 */ + private final ExecutorService[] writeExecutors = createWriteExecutors(); + + private static ExecutorService[] createWriteExecutors() { + ExecutorService[] executors = new ExecutorService[8]; + for (int i = 0; i < executors.length; i++) { + final int port = i; + executors[i] = Executors.newSingleThreadExecutor(runnable -> { + Thread thread = new Thread(runnable, "ch934x-write-" + port); + thread.setDaemon(true); + return thread; + }); + } + return executors; + } + @Override public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { applicationContext = binding.getApplicationContext(); @@ -153,6 +171,9 @@ public class Ch934xSerialPlugin implements FlutterPlugin, MethodCallHandler, Act activeSerialNumber = -1; modemCallbackRegistered = false; exceptionCallbackEnabled = false; + for (ExecutorService executor : writeExecutors) { + executor.shutdownNow(); + } } @Override @@ -211,7 +232,7 @@ public class Ch934xSerialPlugin implements FlutterPlugin, MethodCallHandler, Act result.success(handleRead(call)); break; case "write": - result.success(handleWrite(call)); + handleWriteAsync(call, result); break; case "setGpioOutput": result.success(handleSetGpioOutput(call)); @@ -575,26 +596,35 @@ public class Ch934xSerialPlugin implements FlutterPlugin, MethodCallHandler, Act } } - /** 文档 6.2.1。 */ - private int handleWrite(@NonNull MethodCall call) throws UartLibException { + /** 文档 6.2.1。阻塞 SDK 写入在对应串口的专用线程执行。 */ + private void handleWriteAsync(@NonNull MethodCall call, @NonNull Result result) { if (activeDevice == null) { - return 0; + result.success(0); + return; } byte[] data = call.argument("data"); if (data == null || data.length == 0) { - return 0; + result.success(0); + return; } Integer portIndex = call.argument("serialPortIndex"); int idx = portIndex != null ? portIndex : activeSerialNumber; - if (idx < 0) { - return 0; - } - try { - return CH934XManager.getInstance().writeData( - activeDevice, idx, data, data.length, 2000); - } catch (ChipException e) { - return 0; + if (idx < 0 || idx >= writeExecutors.length) { + result.success(0); + return; } + final UsbDevice device = activeDevice; + writeExecutors[idx].execute(() -> { + int written = 0; + try { + written = CH934XManager.getInstance().writeData( + device, idx, data, data.length, 2000); + } catch (Throwable ignored) { + // 与原同步实现一致:写失败返回 0,由 Dart 层处理。 + } + final int completed = written; + new Handler(Looper.getMainLooper()).post(() -> result.success(completed)); + }); } // ------------------------------------------------------------------------