Middle+
Wyjaśnij, jak działa pętla zdarzeń w kontekście języka Dart i frameworka Flutter.
sobes.tech AI
Odpowiedź od AI
Dart jest jednoprocesowy, ale używa pętli zdarzeń (Event Loop) do obsługi operacji asynchronicznych.
Pętla zdarzeń składa się z dwóch głównych kolejek:
- Kolejka mikrotasków (Microtask Queue): dla wysokopriorytetowych, krótkich zadań asynchronicznych. Są wykonywane natychmiast po zakończeniu bieżącej operacji i przed rozpoczęciem kolejnej iteracji pętli zdarzeń.
- Kolejka zdarzeń (Event Queue): dla zdarzeń zewnętrznych (takich jak I/O, timery, wejście użytkownika). Zadania z tej kolejki są przetwarzane po opróżnieniu kolejki mikrotasków.
Proces działania:
- Główny wątek wykonuje kod synchroniczny.
- Gdy napotka operację asynchroniczną (np.
Future,Stream, timer), jest ona rejestrowana i trafia do odpowiedniej kolejki. - Pętla zdarzeń stale sprawdza kolejkę mikrotasków. Jeśli nie jest pusta, wykonuje jej zadania aż do opróżnienia.
- Następnie sprawdza kolejkę zdarzeń. Jeśli nie jest pusta, pobiera pierwsze zadanie i je wykonuje.
- Cykl powtarza się, aż obie kolejki będą puste i nie będzie oczekujących operacji asynchronicznych.
Przykład użycia Future i scheduleMicrotask:
void main() {
print('1. Początek main');
// Dodaje mikrozadanie do kolejki mikrotasków
scheduleMicrotask(() {
print('3. Mikrozadanie wykonywane');
});
// Tworzy operację asynchroniczną, która zostanie dodana do kolejki zdarzeń po jej zakończeniu
Future(() {
print('4. Future wykonywane (z kolejki zdarzeń)');
});
// Dodaje kolejne mikrozadanie
scheduleMicrotask(() {
print('5. Druga mikrozadanie wykonywane');
});
// Tworzy Future z opóźnieniem, również trafia do kolejki zdarzeń
Future.delayed(Duration(milliseconds: 10), () {
print('6. Opóźnione Future wykonywane (z kolejki zdarzeń)');
});
print('2. Koniec main');
}
// Oczekiwany porządek wykonania:
// 1. Początek main
// 2. Koniec main
// 3. Mikrozadanie wykonywane
// 5. Druga mikrozadanie wykonywane
// 4. Future wykonywane (z kolejki zdarzeń)
// 6. Opóźnione Future wykonywane (z kolejki zdarzeń)
W Flutterze, pętla zdarzeń zarządza wykonywaniem zadań UI (np. rysowaniem widgetów), obsługą gestów, żądaniami sieciowymi i innymi operacjami asynchronicznymi, zapewniając płynne działanie aplikacji bez blokowania interfejsu użytkownika. Ważne zadania Fluttera (np. planowanie klatek do renderowania) często korzystają z kolejki mikrotasków, aby osiągnąć wyższy priorytet.