Sobes.tech
Middle

Miks ei saa asünkroonilises meetodis teha pikki arvutusoperatsioone?

sobes.tech AI

Vastus AI-lt

Pikkade arvutustegevuste teostamine asünkroonmeetodis, mis täidetakse peamise isolaatoris (liidese lõng), blokeerib kasutajaliidese. Kuigi asünkroonmeetod kasutab Future või async/await, täidetakse see ikkagi samas lõngas. Kui ressursimahukas ülesanne on käimas, ei saa kasutajaliides uuendada, mis põhjustab rakenduse "jäädumise".

Pikkade operatsioonide tegemiseks ilma kasutajaliidese blokeerimiseta tuleks kasutada:

  • Isolaatorid: Eraldi täitmisliinid, mis ei jaga mälu peamise isolaatoriga. Isolaatorite vahel suhtlemine toimub portide (SendPort, ReceivePort) kaudu.
  • Compute funktsioon: Mugav kattefunktsioon väikeste arvutuste jaoks isolaatorite loomisel ja haldamisel.
import 'dart:isolate';
import 'package:flutter/foundation.dart';

// Funktsioon, mis teostab pikaajalisi arvutusi
int performHeavyComputation(int data) {
  // Pikaajaliste arvutuste imitatsioon
  int result = 0;
  for (int i = 0; i < 1000000000; i++) {
    result += i;
  }
  return result + data;
}

// Kasutades compute funktsiooni, et täita teises isolaatoris
Future<int> heavyComputationInIsolate(int data) async {
  return compute(performHeavyComputation, data);
}

// Näide StatefulWidgetis
class MyWidgetState extends State<MyWidget> {
  int computationResult = 0;

  Future<void> _startComputation() async {
    // Pikaajalise arvutuse teostamine teises isolaatoris
    computationResult = await heavyComputationInIsolate(10);
    setState(() {
      // UI uuendamine pärast tulemuse saamist
    });
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text('Arvutuse tulemus: $computationResult'),
          ElevatedButton(
            onPressed: _startComputation,
            child: const Text('Alusta arvutusi'),
          ),
        ],
      ),
    );
  }
}