我正在尝试使用Flutter MethodChannel从Android(Java)同步调用一些Flutter方法。
invokeMethod(String method, @Nullable Object arguments, MethodChannel.Result callback)
我已经尝试了CountDownLatch,锁甚至线程,但是在调用倒数等待,同步(锁)甚至thread.join之后会停止。
public class MainActivity extends AppCompatActivity {
// code/methods initializations..
public String testData(){
final String[] result = new String[1];
final CountDownLatch latch = new CountDownLatch(1);
flutterMethods.invokeMethod("getString", "abcdefg", new MethodChannel.Result() {
@Override
public void success(Object o) {
result[0] = o.toString();
Log.e(TAG,"success);
latch.countDown();
}
@Override
public void error(String s, String s1, Object o) {
latch.countDown();
}
@Override
public void notImplemented() {
latch.countDown();
}
}
Log.e(TAG,"about to wait forever!");
latch.await();
Log.e(TAG,"done!");
return result[0];
}
当然,这无需等待即可异步工作,但是我想在某个时候使其成为同步库函数。该怎么办?
答案 0 :(得分:0)
无法完成。
在与OS的通信始终异步的意义上,Flutter体系结构是独特的。原理是Flutter和本机端通过侦听设备上的同一端口来相互发送消息。 由于没有“语言桥”,因此可以提高性能,但是以被迫异步为代价。
答案 1 :(得分:0)
首先,这是一个非常糟糕的主意,您可能不应该这样做。回调在99%的用例中都可以。
但是,如果您仍然真的想要,则简单的方法是仅使用while(!messageRecieved) { // do something }
样式循环。这里的关键重要因素是您不能实际上暂停线程,因为如果您这样做,它将无法接收任何消息。
如果您不想引起不必要的CPU使用,可以尝试在循环体内执行少量的IO操作。