Chcę móc wywołać następującą metodę po określonym opóźnieniu. W celu c było coś takiego:
[self performSelector:@selector(DoSomething) withObject:nil afterDelay:5];
Czy istnieje odpowiednik tej metody w Androidzie z Javą? Na przykład muszę być w stanie wywołać metodę po 5 sekundach.
public void DoSomething()
{
//do something here
}
removeCallbacks(Runnable r)
naHandler
.import android.os.handler
Nie mogłem użyć żadnej innej odpowiedzi w moim przypadku. Zamiast tego użyłem natywnego timera Java.
źródło
Uwaga: Ta odpowiedź została udzielona, gdy w pytaniu nie określono Androida jako kontekstu. Aby uzyskać odpowiedź dotyczącą wątku interfejsu użytkownika Androida, zobacz tutaj.
Wygląda na to, że interfejs Mac OS API pozwala na kontynuację bieżącego wątku i planuje asynchroniczne uruchomienie zadania. W Javie równoważną funkcję zapewnia
java.util.concurrent
pakiet. Nie jestem pewien, jakie ograniczenia może nałożyć Android.źródło
ScheduledFuture<?>
zwróconego przezworker.schedule()
i wywołać jegocancel(boolean)
metodę.ScheduledExecutorService
.Aby wykonać coś w wątku interfejsu użytkownika po 5 sekundach:
źródło
możesz użyć Handler wewnątrz UIThread:
źródło
Dzięki za wszystkie wspaniałe odpowiedzi znalazłem rozwiązanie, które najlepiej odpowiada moim potrzebom.
źródło
1. Korzystanie
Handler
2. Korzystanie z TimerTask
Lub nawet krócej
Lub najkrótszy byłby
3. Korzystanie
Executors
1. Korzystanie
Handler
2. Korzystanie
Timer
3. Korzystanie
ScheduledExecutorService
źródło
How to call a method after a delay in Android
. Skupiłem się na tym. Do momentu. W przeciwnym razie wycieki Java to duży temat, który należy osobno zrozumieć dla programistów.Zobacz to demo:
źródło
Jeśli musisz użyć modułu obsługi, ale przechodzisz do innego wątku, możesz użyć go
runonuithread
do uruchomienia modułu obsługi w wątku interfejsu użytkownika. To uchroni Cię przed wyjątkami zgłoszonymi z prośbą o połączenieLooper.Prepare()
Wygląda dość niechlujnie, ale jest to jeden ze sposobów.
źródło
Wolę używać
View.postDelayed()
metody, prostego kodu poniżej:źródło
Oto moje najkrótsze rozwiązanie:
źródło
źródło
Jeśli używasz Androida Studio 3.0 i nowszych wersji, możesz używać wyrażeń lambda. Metoda
callMyMethod()
jest wywoływana po 2 sekundach:Jeśli chcesz anulować opóźnione uruchomienie, użyj tego:
źródło
Sugeruję Timer , pozwala zaplanować metodę, która będzie wywoływana w bardzo określonym przedziale czasowym. Nie zablokuje to interfejsu użytkownika i utrzyma działanie aplikacji podczas wykonywania metody.
Inną opcją jest wait (); spowoduje to zablokowanie bieżącego wątku na określony czas. Spowoduje to, że interfejs użytkownika przestanie odpowiadać, jeśli zrobisz to w wątku interfejsu użytkownika.
źródło
Aby opóźnić obsługę postu za pomocą prostej linii, możesz wykonać następujące czynności:
mam nadzieję, że to pomoże
źródło
Możesz użyć tego dla najprostszego rozwiązania:
W przeciwnym razie poniżej może znajdować się kolejne czyste użyteczne rozwiązanie:
źródło
Możesz uczynić go znacznie czystszym, używając nowo wprowadzonych wyrażeń lambda:
źródło
Jest zatem kilka rzeczy do rozważenia, ponieważ istnieje tak wiele sposobów na skórowanie tego kota. Chociaż wszystkie odpowiedzi zostały już wybrane i wybrane. Myślę, że ważne jest, aby ponownie zapoznać się z odpowiednimi wytycznymi dotyczącymi kodowania, aby uniknąć sytuacji, w której ktoś pójdzie w niewłaściwym kierunku tylko z powodu „większości wybranych prostych odpowiedzi”.
Więc najpierw omówmy prostą odpowiedź Post Delayed, która jest ogólnie wybraną odpowiedzią w tym wątku.
Kilka rzeczy do rozważenia. Po opóźnieniu postu możesz napotkać wycieki pamięci, martwe przedmioty, cykle życia, które zniknęły i wiele więcej. Ważne jest więc również odpowiednie obchodzenie się z nim. Możesz to zrobić na kilka sposobów.
Ze względu na nowoczesny rozwój dostarczę w KOTLIN
Oto prosty przykład użycia wątku interfejsu użytkownika na wywołaniu zwrotnym i potwierdzeniu, że Twoja aktywność nadal działa i ma się dobrze po uderzeniu w wywołanie zwrotne.
Jednak nadal nie jest to idealne, ponieważ nie ma powodu, aby oddzwonić, jeśli aktywność zniknęła. więc lepszym sposobem byłoby zachować odniesienie do niego i usunąć jego wywołania zwrotne w ten sposób.
i oczywiście zajmuj się czyszczeniem w onPause, aby nie oddzwoniło.
Teraz, kiedy omawialiśmy to, co oczywiste, porozmawiajmy o czystszej opcji z nowoczesnymi coroutines i kotlin :). Jeśli jeszcze ich nie używasz, naprawdę brakuje.
lub jeśli chcesz zawsze uruchamiać interfejs użytkownika dla tej metody, możesz po prostu zrobić:
Oczywiście, podobnie jak PostDelayed, musisz upewnić się, że poradzisz sobie z anulowaniem, więc możesz albo sprawdzić aktywność po opóźnionym połączeniu, albo możesz anulować go w onPause, tak jak na innej trasie.
// obsługa czyszczenia
Jeśli umieścisz uruchomienie (UI) w podpisie metody, zadanie może zostać przypisane w linii wywołującej kodu.
więc morał tej historii jest bezpieczny przy opóźnionych działaniach, upewnij się, że usunąłeś oddzwanianie lub anulowałeś swoje zadania i oczywiście potwierdziłeś, że masz odpowiedni cykl życia, aby dotknąć elementów opóźnionego oddzwaniania. Coroutines oferuje także akcje, które można anulować.
Warto również zauważyć, że zwykle powinieneś sobie poradzić z różnymi wyjątkami, które mogą pochodzić z coroutines. Na przykład anulowanie, wyjątek, limit czasu, cokolwiek zdecydujesz się użyć. Oto bardziej zaawansowany przykład, jeśli zdecydujesz się naprawdę zacząć używać coroutines.
źródło
Stworzyłem prostszą metodę nazywania tego.
Aby z niego skorzystać, wystarczy zadzwonić:
.CallWithDelay(5000, this, "DoSomething");
źródło
performSelector
. to najlepszy sposób na zrobienie tego.Poniżej jeden działa, gdy otrzymasz,
źródło
Korzystając z Kotlin, możemy osiągnąć, wykonując następujące czynności
źródło
Jest bardzo łatwy w użyciu
CountDownTimer
. Aby uzyskać więcej informacji https://developer.android.com/reference/android/os/CountDownTimer.htmlźródło
Jeśli używasz RxAndroid, obsługa wątków i błędów staje się znacznie łatwiejsza. Poniższy kod wykonuje się z opóźnieniem
źródło
wydaje się, że wszyscy zapominają wyczyścić moduł obsługi przed opublikowaniem nowego pliku uruchamialnego lub wiadomości na nim. W przeciwnym razie mogłyby się kumulować i powodować złe zachowanie.
źródło
Oto kolejny podchwytliwy sposób: nie wyrzuci wyjątku, gdy wykonalne zmiany elementów interfejsu użytkownika.
Możesz wywołać animację w następujący sposób:
Animacja może zostać dołączona do dowolnego widoku.
źródło
Oto odpowiedź w Kotlin, ty leniwy, leniwy ludzie:
źródło
Lubię rzeczy czystsze: oto moja implementacja, wbudowany kod do użycia w twojej metodzie
źródło
Odpowiednie rozwiązanie w Androidzie:
źródło
Podobne rozwiązanie, ale o wiele czystsze w użyciu
Napisz tę funkcję poza klasą
Stosowanie:
źródło
do
jest wbudowaną metodą, dlatego musimy użyć `, aby użyć go jako nazwy zmiennejdo
po 3 sekundachW Androidzie możemy napisać poniżej kodu kotlin, aby opóźnić wykonanie dowolnej funkcji
źródło