Wątki w Android OS Matt Rutkowski GynSoft sp. z o.o. http://gynsoft.net matt@gynsoft.net
Krótko o terminach związanych z Android OS... Android OS bazuje na Linuxie, każda aplikacja posiada własne User ID i jest widziana jako osobny użytkownik Activity reprezentuje pojedynczy ekran aplikacji Service usługa działająca w tle AndroidManifest plik konfiguracyjny Intent, bundle - uruchamianie Activity, przekazywanie danych
Wątek vs proces co to jest? Wątki Część programu wykonywana współbieżnie w obrębie jednego procesu W jednym procesie może istnieć wiele wątków Wątki działające w obrębie procesu współdzielą ze sobą dane i struktury systemowe API: java.lang.thread Proces Egzemplarz wykonywanego programu Posiada niezależne zasoby Każdy proces posiada osobną VM Każdy proces posiada unikatowe PID API: android.os.process
Wątek vs. proces w Android OS Wątki Architektura bazująca o pthread Domyślnie aplikacja działa w jednym wątku tzw. UI Thread Zmienne klasowe są dostępne dla każdego wątku i mogą być modyfikowane z niego Dostępne są trzy priorytety (MIN, NORMAL, MAX) Nie można bezpośrednio mody Wątki użytkownika nie mogą bezpośrednio modyfikować UI Proces Aplikacja może mieć jeden bądź kilka procesów Procesy posiadają swoje nazwy definiowane w AndroidManifest Skomplikowana i kosztowna komunikacja między procesami
Wątki w Android OS jak to działa Wątki androidowe zachowują się podobnie jak te z znane z Javy
Wątki w Android OS Messages Kiedy jest tworzony proces aplikacji, wątek główny tworzy kolejkę komunikatów (message queue) która obsługuje wszystkie zdarzenia wysyłane przez obiekty aplikacji Tworząc nowy wątek można komunikować się z wątkiem głównym poprzez tzw. Handler Handler jest przypisany do kolejki komunikatów w której został utworzony Handler dodaje komunikat do kolejki
Wątki w Android OS Messages Inny wątek chcący wysłać komunikat do UI Thread musi wywołać metodę obtainmessage(), kolejno wysyła do kolejki komunikat wywołując sendmessage() Handler przetwarza komunikaty w handlemessage() handlemessage() jest wywoływane dla każdego nadchodzącego komunikatu
Wątki w Android OS Messages
Wątki w Android OS Messages Wątek główny Inny wątek
Wątki w Android OS Messages Wysyłanie komunikatu: sendmessage() dodaje komunikat na końcu kolejki bez oczekiwania sendmessageatfrontofqueue() dodaje komunikat na początku kolejki sendmessageattime() dodaje komunikat do kolejki o określonym czasie bazując na systemowym uptime (SystemClock.uptimeMillis()) sendmessagedelayed() dodaje komunikat do kolejki z opóźnieniem podanym w milisekundach Czyszczenie kolejki komunikatów: removemessages() usuwa wszystkie komunikaty z kolejki
Wątki w Android OS Messages Przetwarzanie komunikatów odbywa się w handlemessage() który jest uruchamiany dla każdego komunikatu w kolejce w handlemessage(): można dokonywać zmian w UI Thread zmiany muszą być dokonywane szybko ponieważ inne operacje w UI Thread są zatrzymane do momentu zakończenia obsługi komunikatu
Wątki w Android OS Runnable Wątek główny Inny wątek
Wątki w Android OS Runnable Wysyłanie Runnable do kolejki komunikatów: post() dodaje Runnable do końca kolejki postatfrontofqueue() dodaje Runnable na początku kolejki postattime() - dodaje Runnable do kolejki o określonym czasie bazując na systemowym uptime (SystemClock.uptimeMillis()) postdelayed() dodaje Runnable do kolejki z opóźnieniem Czyszczenie kolejki komunikatów dla danego Runnable: removecallbacks()
Wątki w Android OS czego nie wolno... W oncreate() jakiegoś Activity W innym wątku:
Wątki w Android OS przykład 1
Wątki w Android OS przykład 1
Wątki w Android OS przykład 1
Wątki w Android OS przykład 1
Wątki w Android OS przykład 1
Wątki w Android OS przykład 1
Wątki w Android OS przykład 2
Wątki w Android OS przykład 2
Wątki w Android OS przykład 2
Wątki w Android OS przykład 2
Wątki w Android OS przykład 2
Wątki w Android OS przykład 2
Wątki w Android OS przykład 2
Wątki w Android OS przykład 3
Wątki w Android OS przykład 3 Goole Maps w MapView Dane pobieramy dynamicznie z WebAPI Informacje uaktualniamy w momencie przesunięcia mapy jak i zoom in/out Pokazujemy punkty na mapie
Wątki w Android OS przykład 3
Wątki w Android OS przykład 3
Wątki w Android OS przykład 3
Wątki w Android OS dobre praktyki
Wątki w Android OS dobre praktyki
Wątki w Android OS dobre praktyki XML / JSON XML pull parser / SAX spore pliki XML / JSON
Wątki w Android OS dobre praktyki
Wątki w Android OS wątki i debugowanie
Wątki w Android OS debugowanie Log.d("appname","event description") adb logcat DDMS