Как запустить пользовательский код для платформы в фоновом режиме?
Когда я запускаю тяжелое выполнение кода. Весь интерфейс 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");
}
);
}
Я пытался создать поток, но 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);
},
),
);
}
}