java - 如何在后台运行自定义平台特定代码?

标签 java flutter

当我运行大量代码时。整个 Flutter 界面都卡住了。如何使这个过程异步?

@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
    GeneratedPluginRegistrant.registerWith(flutterEngine);

    MethodChannel methodChannel = new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL);
    methodChannel.setMethodCallHandler(
            (call, result) -> {
                try {
                    //Emulate HardWork
                    TimeUnit.SECONDS.sleep(5);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                result.success("HardWork Result");
            }
    );
}

我尝试创建一个线程,但结果在结束之前被破坏,并且应用程序崩溃了

public class MainActivity extends FlutterActivity {
    private static final String CHANNEL = "test/channel";

    @Override
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);

        MethodChannel methodChannel = new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL);
        methodChannel.setMethodCallHandler(
                (call, result) -> new Thread(new MyRunnable(result)).start()
        );
    }
}

class MyRunnable implements Runnable {
    private MethodChannel.Result result;

    MyRunnable(MethodChannel.Result result) {
        this.result = result;
    }

    public void run() {
        try {
            //Emulate HardWork
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        result.success("HardWork Result");
    }
}

Flutter端调用并等待结果的实现

class _MyHomePageState extends State<MyHomePage> {
  static const platform = const MethodChannel(CHANNEL);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: CircularProgressIndicator(),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          String response = await platform.invokeMethod("hardWork");
          print(response);
        },
      ),
    );
  }
}

最佳答案

您必须在 UI 线程上回复,请参阅:https://flutter.dev/docs/development/platform-integration/platform-channels#jumping-to-the-ui-thread-in-android

new Handler(Looper.getMainLooper()).post(new Runnable() {
  @Override
  public void run() {
    result.success("HardWork Result");
  }
});

关于java - 如何在后台运行自定义平台特定代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60085875/

相关文章:

android - Flutter - 多个图标改变了每个图标的颜色

java - 使用Java简单串行连接器连接电脑与arduino

java - 在 poi-4.0.1 中找不到符号变量 Cell.CELL_TYPE_STRING

Flutter屏幕尺寸计算

flutter - Flutter 中的视频播放器错误 com.google.android.exoplayer2.mediacodec.MediaCodecRenderer$DecoderInitializationException

testing - Flutter测试时如何找到Widget的 `text`属性?

flutter - 如何从单独的文件中使用 flutter url_launcher 函数?

java - 理解java中的委托(delegate)模式

java - 程序编译但不运行

Java - Println 不按顺序