Android Academy · Lekcja

viewModelScope i Dispatchers

Wykonuj pracę we właściwym wątku

Lekcja 2 z 413 kroki

viewModelScope i Dispatchers to bezpłatna lekcja Android Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Android Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Android Academy zawiera 4 lekcji w sumie.

Zakresy świadome cyklu życia

Android udostępnia wbudowane zakresy, które anulują korutyny automatycznie:

  • viewModelScope — anulowany, gdy ViewModel zostanie usunięty.
  • lifecycleScope — powiązany z cyklem życia Activity/Fragment.

Korzystanie z viewModelScope

Uruchamiaj operacje na danych w viewModelScope. Gdy ViewModel zostanie usunięty, korutyna zostanie anulowana automatycznie — bez ręcznego sprzątania.

class UserViewModel(
    private val repo: UserRepository
) : ViewModel() {
    fun load() {
        viewModelScope.launch {
            val users = repo.getUsers()
            _uiState.value = UiState(users)
        }
    }
}

Dlaczego nie używać GlobalScope

Unikaj GlobalScope: jego korutyny działają przez cały czas pracy aplikacji i nigdy nie są powiązane z cyklem życia, co prowadzi do wycieków oraz kontynuowania pracy po zniknięciu ekranu.

Czym są dyspozytory?

Dyspozytor decyduje, w którym wątku (lub puli wątków) działa korutyna. Wybór właściwego dyspozytora pozwala zwolnić wątek główny.

Standardowe dyspozytory

  • Dispatchers.Main — wątek interfejsu użytkownika.
  • Dispatchers.IO — operacje wejścia-wyjścia sieciowe i dyskowe.
  • Dispatchers.Default — zadania intensywnie wykorzystujące procesor.

viewModelScope domyślnie używa Main

viewModelScope uruchamia korutyny w Dispatchers.Main. Jest to odpowiednie do aktualizowania stanu, ale ciężkie operacje należy przenieść poza ten dyspozytor.

Przełączanie za pomocą withContext

Użyj withContext, aby uruchomić blok kodu z innym dyspozytorem, a następnie powrócić do wywołującego.

suspend fun loadFile(): String =
    withContext(Dispatchers.IO) {
        File("data.txt").readText()
    }

Funkcje bezpieczne dla wątku głównego

Funkcja jest bezpieczna dla wątku głównego, jeśli można ją bezpiecznie wywołać z wątku głównego, ponieważ wewnętrznie przełącza dyspozytor. Repozytoria powinny być bezpieczne dla wątku głównego, aby wywołujący nie musieli martwić się o wątki.

class Repo {
    suspend fun getUsers() =
        withContext(Dispatchers.IO) { dao.getAll() }
}

Room i Retrofit są bezpieczne dla wątku głównego

Dobra wiadomość: metody DAO suspend w Room oraz wywołania suspend w Retrofit już działają poza wątkiem głównym. Zwykle nie trzeba jawnie używać dla nich withContext.

Praca procesora w Default

W przypadku intensywnych obliczeń, takich jak sortowanie ogromnej listy lub analizowanie danych, użyj Dispatchers.Default, aby uniknąć zacinania interfejsu.

val sorted = withContext(Dispatchers.Default) {
    bigList.sortedBy { it.score }
}

Wstrzykiwanie dyspozytorów

Aby ułatwić testowanie, wstrzykuj dyspozytory zamiast wpisywać je na stałe. Dzięki temu testy mogą używać dyspozytora testowego.

class Repo(
    private val io: CoroutineDispatcher = Dispatchers.IO
) {
    suspend fun load() = withContext(io) { /* ... */ }
}

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat zakresów i dyspozytorów.

Powtórzenie

Uczestnik nauczył się:

  • viewModelScope anuluje korutyny, gdy ViewModel zostaje usunięty.
  • Unikać GlobalScope.
  • Dobierać dyspozytory: Main (interfejs), IO (sieć/dysk), Default (procesor).
  • withContext przełącza wątki; należy dążyć do funkcji bezpiecznych dla wątku głównego.
Bezpłatny start

Ucz się Kotlin dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
36
Lekcje
152

Często zadawane pytania

Czy lekcja „viewModelScope i Dispatchers” jest bezpłatna?

Tak — pełny tekst „viewModelScope i Dispatchers” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Android Academy, przejdź na CoddyKit PRO. Kurs Android Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „viewModelScope i Dispatchers”?

Wykonuj pracę we właściwym wątku Ćwiczysz Android Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Android Academy?

Nie wymagamy żadnego doświadczenia. Android Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „viewModelScope i Dispatchers”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Android Academy?

Tak. Każda lekcja Android Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Podstawy korutyn i zakresów
  2. viewModelScope i Dispatchers
  3. Podstawy Kotlin Flow
  4. StateFlow i SharedFlow
← Powrót do Android Academy