viewModelScope i Dispatchers
Wykonuj pracę we właściwym wątku
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ę:
viewModelScopeanuluje korutyny, gdy ViewModel zostaje usunięty.- Unikać
GlobalScope. - Dobierać dyspozytory: Main (interfejs), IO (sieć/dysk), Default (procesor).
withContextprzełącza wątki; należy dążyć do funkcji bezpiecznych dla wątku głównego.
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
- Podstawy korutyn i zakresów
- viewModelScope i Dispatchers
- Podstawy Kotlin Flow
- StateFlow i SharedFlow