我有一个Flutter应用程序,使用methodchannel调用Java插件。
我试图理解线程模型和异步行为。所以流程如下:UI事件处理程序调用await methodchannel.invoke("Foo", params)。这将控制权转移给Java方法调用处理程序。在那里,我回复.success以解除在Dart中的等待。等待返回并使flutter UI事件处理程序返回。
在Java插件中,我在result.success之后继续进行更多的工作,比如说2秒。
问题是(我的问题)在这2秒内,flutter主线程/UI被阻塞了,即使flutter事件处理程序已经在2秒前返回了?为什么会这样?我可以从日志记录中看到dart和Java代码在两个单独的线程中运行。感谢您的答复。
我试图理解线程模型和异步行为。所以流程如下:UI事件处理程序调用await methodchannel.invoke("Foo", params)。这将控制权转移给Java方法调用处理程序。在那里,我回复.success以解除在Dart中的等待。等待返回并使flutter UI事件处理程序返回。
在Java插件中,我在result.success之后继续进行更多的工作,比如说2秒。
问题是(我的问题)在这2秒内,flutter主线程/UI被阻塞了,即使flutter事件处理程序已经在2秒前返回了?为什么会这样?我可以从日志记录中看到dart和Java代码在两个单独的线程中运行。感谢您的答复。
await
本身并不会阻塞 UI,它只会延迟下面await
后面的代码执行,直到返回的Future
完成。其他异步代码仍然可以被调用(例如根据屏幕刷新速率来调用计时器、动画触发器或框架调用的其他代码)。但我不知道调用 Java 是否会阻塞 UI 线程。 - Günter Zöchbauer