Android端使用CompletableFuture时Flutter插件方法调用无法完成如何解决
问题根因
Flutter 规定 MethodChannel.Result 的回调方法(success/error/notImplemented)必须在 Android 主线程(UI 线程)执行。你当前代码中 CompletableFuture.thenRunAsync 默认会在子线程(ForkJoinPool 工作线程)调用 result.success,虽然 Android 侧代码执行了该方法,但 Flutter 侧无法接收到回调,导致 Dart 端第一个 await Zcspos.echo("Echo 1") 一直处于等待状态,后续的两个调用根本不会执行。
修复方案
修改 ZcsposPlugin.java 代码,将 Result 相关回调的调用切换到 Android 主线程执行,参考修改代码如下:
// 先在插件类中初始化绑定主线程Looper的Handler private final Handler mainHandler = new Handler(Looper.getMainLooper()); private CompletableFuture<Void> waitAsync(int milliseconds) { return CompletableFuture.runAsync(() -> { try { Thread.sleep(milliseconds); } catch (InterruptedException e) { e.printStackTrace(); } }); } @Override public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result) { switch (call.method) { case "echo": { final String value = call.argument("value"); this.waitAsync(1000).thenRunAsync(() -> { // 等待1秒 Log.d(this.TAG, "Echoing '" + value + "'"); // 切换到主线程调用Result回调 mainHandler.post(() -> result.success(value)); }); break; } default: mainHandler.post(result::notImplemented); } }
修改后所有Result回调都在主线程执行,Flutter端就能正常接收返回值,三个异步调用会依次执行,输出符合预期。
内容的提问来源于stack exchange,提问作者Martin Braun
相关产品推荐
相关产品推荐

