Sobes.tech
Middle

Kāpēc ilgstošas aprēķinu operācijas nevar veikt asinhronajā metodē?

sobes.tech AI

Atbilde no AI

Ilgstošas aprēķinu operācijas asinhronajā metodē, kas izpildīta galvenajā izolātā (UI pavedienā), bloķē UI. Neskatoties uz to, ka asinhronā metode izmanto Future vai async/await, tā joprojām tiek izpildīta tajā pašā pavedienā. Kamēr tiek veikta resursu intensīva uzdevums, UI nevar tikt atjaunināts, kas noved pie lietotnes "sasalšanas".

Lai veiktu ilgstošas operācijas bez UI bloķēšanas, jāizmanto:

  • Izolāti: Atsevišķi izpildes pavedieni, kas nedalās ar galveno izolātu. Savienojums starp izolātiem notiek caur portiem (SendPort, ReceivePort).
  • Compute funkcija: Ērta apvalka funkcija mazākiem aprēķiniem, lai izveidotu un pārvaldītu izolātus.
import 'dart:isolate';
import 'package:flutter/foundation.dart';

// Funkcija, kas veic ilgstošus aprēķinus
int performHeavyComputation(int data) {
  // Ilgstošu aprēķinu imitācija
  int result = 0;
  for (int i = 0; i < 1000000000; i++) {
    result += i;
  }
  return result + data;
}

// Izmantojot compute, lai izpildītu citā izolātā
Future<int> heavyComputationInIsolate(int data) async {
  return compute(performHeavyComputation, data);
}

// Piemērs ar StatefulWidget
class MyWidgetState extends State<MyWidget> {
  int computationResult = 0;

  Future<void> _startComputation() async {
    // Ilgstošu aprēķinu izpilde citā izolātā
    computationResult = await heavyComputationInIsolate(10);
    setState(() {
      // UI atjaunināšana pēc rezultāta saņemšanas
    });
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text('Aprēķinu rezultāts: $computationResult'),
          ElevatedButton(
            onPressed: _startComputation,
            child: const Text('Sākt aprēķinus'),
          ),
        ],
      ),
    );
  }
}