Middle
De ce nu se pot realiza operații de calcul prelungite într-o metodă asincronă?
sobes.tech AI
Răspuns de la AI
Operațiile de calcul prelungite într-o metodă asincronă, executată în izolatorul principal (firul UI), blochează UI-ul. Deși metoda asincronă utilizează Future sau async/await, ea totuși rulează în același fir. În timp ce o sarcină consumatoare de resurse este în curs de execuție, UI-ul nu poate fi actualizat, ceea ce duce la "înghețarea" aplicației.
Pentru a efectua operații lungi fără a bloca UI-ul, trebuie să folosiți:
- Izolate: Fire de execuție separate care nu împart memoria cu izolatorul principal. Comunicația între izolate se face prin porturi (SendPort, ReceivePort).
- Funcția Compute: Un wrapper convenabil pentru crearea și gestionarea izolatelor pentru calcule mici.
import 'dart:isolate';
import 'package:flutter/foundation.dart';
// Funcție care efectuează calcule lungi
int performHeavyComputation(int data) {
// Simulare de calcule lungi
int result = 0;
for (int i = 0; i < 1000000000; i++) {
result += i;
}
return result + data;
}
// Utilizarea compute pentru a executa într-un alt izolator
Future<int> heavyComputationInIsolate(int data) async {
return compute(performHeavyComputation, data);
}
// Exemplu de utilizare într-un StatefulWidget
class MyWidgetState extends State<MyWidget> {
int computationResult = 0;
Future<void> _startComputation() async {
// Apelarea calculelor lungi într-un alt izolator
computationResult = await heavyComputationInIsolate(10);
setState(() {
// Actualizarea UI după obținerea rezultatului
});
}
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Rezultatul calculului: $computationResult'),
ElevatedButton(
onPressed: _startComputation,
child: const Text('Începe calculul'),
),
],
),
);
}
}