如何使用invokeMethod从Android到Flutter同步等待结果回调?

时间:2018-12-11 05:00:06

标签: android flutter

我正在尝试使用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];
    }

当然,这无需等待即可异步工作,但是我想在某个时候使其成为同步库函数。该怎么办?

2 个答案:

答案 0 :(得分:0)

无法完成。

在与OS的通信始终异步的意义上,Flutter体系结构是独特的。

原理是Flutter和本机端通过侦听设备上的同一端口来相互发送消息。 由于没有“语言桥”,因此可以提高性能,但是以被迫异步为代价。

答案 1 :(得分:0)

首先,这是一个非常糟糕的主意,您可能不应该这样做。回调在99%的用例中都可以。

但是,如果您仍然真的想要,则简单的方法是仅使用while(!messageRecieved) { // do something }样式循环。这里的关键重要因素是您不能实际上暂停线程,因为如果您这样做,它将无法接收任何消息。

如果您不想引起不必要的CPU使用,可以尝试在循环体内执行少量的IO操作。