Wprowadzenie do Kotlin Coroutines

Dec 07 2022
Współprogram to wzorzec projektowy współbieżności, którego można użyć w systemie Android w celu uproszczenia kodu, który jest wykonywany asynchronicznie. Coroutines = Co + Routines Tutaj Co oznacza współpracę, a procedury oznaczają funkcje.

Współprogram to wzorzec projektowy współbieżności, którego można użyć w systemie Android w celu uproszczenia kodu, który jest wykonywany asynchronicznie.

Coroutines = Co + Routines
Tutaj Co oznacza współpracę, a procedury oznaczają funkcje.

W programach asynchronicznych wiele zadań jest wykonywanych równolegle w osobnych wątkach bez czekania na zakończenie innych zadań. Wątki są kosztownym zasobem, a zbyt duża liczba wątków prowadzi do narzutu wydajności ze względu na wysokie zużycie pamięci i procesora.

Jakie są właściwości Coroutines?

  • Lekki : Możesz uruchomić wiele współprogramów w jednym wątku dzięki obsłudze zawieszenia , która nie blokuje wątku, w którym działa współprogram. Wstrzymywanie oszczędza pamięć w porównaniu z blokowaniem, jednocześnie obsługując wiele równoczesnych operacji.
  • Mniej wycieków pamięci : używaj ustrukturyzowanej współbieżności do uruchamiania operacji w zakresie.
  • Wbudowana obsługa anulowania : anulowanie jest propagowane automatycznie przez działającą hierarchię coroutine.
  • Integracja Jetpack : Wiele bibliotek Jetpack zawiera rozszerzenia , które zapewniają pełną obsługę coroutines. Niektóre biblioteki udostępniają również własny zakres coroutine , którego można użyć do ustrukturyzowanej współbieżności.

Dodanie do części „build.gradle(Module:App.app)” zależności odbywa się w następujący sposób.

Zakresy Coroutine i konstruktorzy

Konstruktorzy Coroutine to funkcje, które pomagają nam stworzyć współprogram. Można je wywoływać z normalnych funkcji, ponieważ nie zawieszają się. Poniżej wymieniono trzech konstruktorów współprogramowych.

runBlocking : Tworzy nową funkcję coroutines i dopóki nie zostanie ukończona, aby zablokować główny wątek.

uruchom : Jest to funkcja konstruktora, która nie blokuje uruchomionego wątku i zwraca obiekt Job. Aby użyć tej funkcji, musimy znajdować się w zakresie Coroutine.

async : To konstruktor coroutine, który zwraca pewną wartość dzwoniącemu. async może służyć do wykonywania zadania asynchronicznego, które zwraca wartość. Ta wartość w kategoriach Kotlina jest wartością Deferred<T>.

Czym są różnice w uruchamianiu i asynchronizacji?

uruchom&asynchronizuj

Czym różnią się GlobalScope i runBlocking?

GlobalScope jest niezależny i nadal działa, nawet jeśli wątek się kończy. Działa przez cały cykl życia aplikacji.

Dane wyjściowe: runBlocking i GlobalScope

Podobnie jak w powyższym kodzie, GlobalScope kontynuuje działanie, nawet jeśli wątek się zakończy.

Co to jest funkcja zawieszenia?

Pisanie funkcji wstrzymania przypomina pisanie normalnej funkcji. Jedyna różnica polega na tym, że zaczynają się tylko od pobrania słowa kluczowego suspend. Wewnątrz współprogramów znajdują się funkcje, które można uruchomić. Funkcja wstrzymania to funkcja, którą można uruchamiać, wstrzymywać i wznawiać. Jedną z najważniejszych rzeczy do zapamiętania na temat funkcji zawieszania jest to, że można je wywoływać tylko z współprogramu lub innej funkcji zawieszania.

Dane wyjściowe: basicCoroutinesExample.kt

Za pomocą funkcji uruchamiania nowa współprogram jest uruchamiana równolegle z resztą kodu.

runBlocking uruchamia również nową procedurę.
Podczas runBlocking bieżący wątek: main jest blokowany do momentu wykonania całego kodu w treści funkcji.

Funkcje, które zawieszają, nazywane są funkcjami RunningTask .
Zawiesza współprogram bez blokowania podstawowego wątku, ale umożliwia innym współprogramom uruchamianie i używanie podstawowego wątku dla ich kodu.

Co to są dyspozytorzy Coroutine?

Coroutine Dispatcher to struktura, która decyduje o wątku, w którym będzie działać coroutine.

Możemy myśleć, że dyspozytorzy odpowiadają obiektowi harmonogramu w reaktywnych frameworkach (np. rxJava).

Wiadomo, że coroutine są zawsze uruchamiane w określonym kontekście, a ten kontekst opisuje, w których wątkach zostanie uruchomiony coroutine. Ogólnie rzecz biorąc, możemy uruchomić coroutine za pomocą GlobalScope bez przekazywania do niego żadnych parametrów, dzieje się tak, gdy jesteśmy nieokreślenie wątku, w którym współprogram powinien zostać uruchomiony. Ta metoda nie daje nam nad nią zbytniej kontroli, gdyż naszą współprogram można uruchomić w dowolnym dostępnym wątku, przez co nie można przewidzieć wątku, w którym uruchomiono nasze współprogramy.

Istnieją głównie 4 rodzaje dyspozytorów.

  • Główny dyspozytor
  • Dyspozytor IO
  • Domyślny dyspozytor
  • Nieograniczony dyspozytor
  • Dispatchers.Main — Użyj tego dyspozytora, aby uruchomić współprogram w głównym wątku Androida. Powinno to być używane tylko do interakcji z interfejsem użytkownika i wykonywania szybkich prac. Przykłady obejmują wywoływanie funkcji zawieszania , uruchamianie operacji struktury interfejsu użytkownika systemu Android i aktualizowanie LiveDataobiektów.
  • Dispatchers.IO — Ten program dyspozytorski jest zoptymalizowany do wykonywania dyskowych lub sieciowych operacji we/wy poza głównym wątkiem. Przykłady obejmują używanie komponentu Pokój , odczytywanie lub zapisywanie plików oraz wykonywanie dowolnych operacji sieciowych.
  • Dispatchers.Default — Ten program dyspozytorski jest zoptymalizowany do wykonywania zadań intensywnie obciążających procesor poza głównym wątkiem. Przykładowe przypadki użycia obejmują sortowanie listy i analizowanie JSON.

Zasoby