Opracowałem aplikację do wyświetlania tekstu w określonych odstępach czasu na ekranie emulatora Androida. Korzystam z Handler
klasy. Oto fragment mojego kodu:
handler = new Handler();
Runnable r = new Runnable() {
public void run() {
tv.append("Hello World");
}
};
handler.postDelayed(r, 1000);
Po uruchomieniu tej aplikacji tekst jest wyświetlany tylko raz. Dlaczego?
android
multithreading
Rajapandian
źródło
źródło
Odpowiedzi:
Prosta poprawka do twojego przykładu to:
Lub możemy na przykład użyć normalnego wątku (z oryginalnym Runnerem):
Możesz uznać swój uruchamialny obiekt za polecenie, które można wysłać do kolejki komunikatów w celu wykonania, a moduł obsługi jako za obiekt pomocniczy używany do wysłania tego polecenia.
Więcej informacji znajduje się tutaj http://developer.android.com/reference/android/os/Handler.html
źródło
źródło
Myślę, że mogę poprawić pierwsze rozwiązanie Alex2k8 dla aktualizacji poprawnych co sekundę
1. oryginalny kod:
2. Analiza
tv.append("Hello Word")
koszt T milisekund, po wyświetleniu 500 razy opóźniony czas to 500 * T milisekund3. Rozwiązanie
Aby tego uniknąć Po prostu zmień kolejność postDelayed (), aby uniknąć opóźnień:
źródło
Do powtarzania zadania możesz użyć
nazywaj to jak
Gdzie
zadanie będące metodą do wykonania
po czasie do pierwszego wykonania
( przedział czasu na powtórzenie wykonania)
Po drugie
Możesz także użyć CountDownTimer, jeśli chcesz wykonać zadanie kilka razy.
Możesz to również zrobić przy pomocy Runnable. utwórz metodę uruchamialną, taką jak
I nazwij to na dwa sposoby
LUB
źródło
Uważam, że w tym typowym przypadku, tj. Aby uruchomić coś ze stałym interwałem,
Timer
bardziej odpowiednie jest. Oto prosty przykład:Korzystanie
Timer
ma kilka zalet:schedule
argumentach funkcjimyTimer.cancel()
myTimer.cancel()
przed zaplanowaniem nowego wątku (jeśli myTimer nie ma wartości null)źródło
źródło
r
która jest jeszcze zdefiniowana.Jeśli dobrze rozumiem dokumentację metody Handler.post ():
Przykłady podane przez @ alex2k8, mimo że działają poprawnie, nie są takie same. W przypadku, gdy
Handler.post()
jest używany, nie są tworzone nowe wątki . Po prostu publikujeszRunnable
w wątku,Handler
który ma zostać wykonany przez EDT . Potem EDT wykonuje tylkoRunnable.run()
nic więcej.Pamiętaj:
Runnable != Thread
.źródło
Kotlin
Jawa
źródło
Ciekawym przykładem jest ciągłe obserwowanie licznika / stopera w osobnym wątku. Pokazuje również lokalizację GPS. Podczas gdy główna aktywność Wątek interfejsu użytkownika już tam jest.
Fragment:
Aby zobaczyć kod zobacz tutaj:
Przykład wątku przedstawiający lokalizację GPS i bieżący czas, które można uruchomić obok wątku interfejsu użytkownika głównej aktywności
źródło
teraz w Kotlin możesz uruchamiać wątki w ten sposób:
źródło
Kotlin z Coroutines
W Kotlin, używając coroutines, możesz wykonać następujące czynności:
Wypróbuj tutaj !
źródło