当我运行大量代码时。整个 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/