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



当我运行繁重的代码执行时。整个 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");
}
}

在颤振端实现调用和等待结果

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");
}
});

最新更新