Chcę zrobić przerwę między dwoma wierszami kodu, Pozwól, że wyjaśnię trochę:
-> użytkownik klika przycisk (w rzeczywistości karta) i pokazuję go, zmieniając tło tego przycisku:
thisbutton.setBackgroundResource(R.drawable.icon);
-> po powiedzmy 1 sekundę, muszę wrócić do poprzedniego stanu przycisku, zmieniając tło:
thisbutton.setBackgroundResource(R.drawable.defaultcard);
-> Próbowałem wstrzymać wątek między tymi dwoma wierszami kodu za pomocą:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
To jednak nie działa. Może to proces, a nie Wątek, który muszę zatrzymać?
Próbowałem też (ale to nie działa):
new Reminder(5);
Z tym:
public class Reminder {
Timer timer;
public Reminder(int seconds) {
timer = new Timer();
timer.schedule(new RemindTask(), seconds*1000);
}
class RemindTask extends TimerTask {
public void run() {
System.out.format("Time's up!%n");
timer.cancel(); //Terminate the timer thread
}
}
}
Jak mogę zatrzymać / uśpić wątek lub proces?
android
process
multithreading
Hubert
źródło
źródło
(!conditionCheck()) {}
zwykle jest to odradzane.Odpowiedzi:
Jednym z rozwiązań tego problemu jest użycie metody Handler.postDelayed () . Niektóre materiały szkoleniowe Google sugerują to samo rozwiązanie.
Jednak niektórzy zauważyli, że powyższe rozwiązanie powoduje wyciek pamięci, ponieważ wykorzystuje niestatyczną wewnętrzną i anonimową klasę, która domyślnie zawiera odniesienie do swojej klasy zewnętrznej, działania. Jest to problem, gdy kontekst działania jest odśmiecany.
Bardziej złożone rozwiązanie pozwalające uniknąć wycieku pamięci podklas
Handler
iRunnable
ze statycznymi klasami wewnętrznymi wewnątrz działania, ponieważ statyczne klasy wewnętrzne nie zawierają niejawnego odniesienia do ich klasy zewnętrznej:Zauważ, że
Runnable
używa WeakReference do działania, co jest konieczne w klasie statycznej, która potrzebuje dostępu do interfejsu użytkownika.źródło
final Button mynewbutton = mybutton;
a następnie użyćmynewbutton
w module obsługi i Runnable.Możesz spróbować tego, który jest krótki
OSTRZEŻENIE : Nigdy nie rób tego w wątku interfejsu użytkownika.
Użyj tego do spania np. wątek tła.
Pełne rozwiązanie Twojego problemu będzie: To jest dostępne API 1
Bez tworzenia modułu obsługi tmp. Również to rozwiązanie jest lepsze niż @tronman, ponieważ nie zachowujemy widoku Handlera. Nie mamy też problemu z Handlerem stworzonym przy złym wątku;)
Dokumentacja
Kod dla postDelayed from View class:
źródło
OMG of course do this in background thread
ma znaczenia, chyba że pokażesz JAK umieścić go w wątku w tle. W tym momencie odkryjesz, że masz odpowiedź bardziej skomplikowaną niż już zaakceptowana. Czy wspomniałem, że trzy lata temu zaakceptowano lepsze rozwiązanie? : PHandler + postRunnable
dokonuje tego wszystkiego w jednym kroku. Bez obciążenia systemowego tworzenia drugiego wątku.Używam tego:
źródło
e.getLocalizedMessage()
ma robić?Handler/postDelayed
rozwiązanie ma dwie zalety: (1) pozwala uniknąć narzutu systemowego na drugi wątek, (1) działa na wątku interfejsu użytkownika, dzięki czemu można wprowadzać zmiany interfejsu użytkownika bez powodowania wyjątku.Prawdopodobnie nie chcesz tego robić w ten sposób. Umieszczając wyraźny element
sleep()
w module obsługi zdarzeń klikniętym przyciskiem, faktycznie zablokowałbyś cały interfejs użytkownika na sekundę. Jedną z możliwości jest użycie timera z jednym strzałem . Utwórz TimerTask, aby zmienić kolor tła z powrotem na domyślny, i zaplanuj go w Timerze.Inną możliwością jest użycie modułu obsługi . Jest tutorial o kimś, kto przeszedł z używania Timera na Handler.
Nawiasem mówiąc, nie można wstrzymać procesu. Proces Java (lub Android) ma co najmniej 1 wątek i możesz tylko uśpić wątki.
źródło
Używam CountDownTime
źródło
To właśnie zrobiłem pod koniec dnia - teraz działa dobrze:
źródło
Oprócz odpowiedzi pana Jankowskiego można również użyć
postDelayed()
. Jest to dostępne na dowolnejView
karcie (np. Na karcie) i trwa pewienRunnable
okres. WykonujeRunnable
po tym opóźnieniu.źródło
To jest mój przykład
Utwórz narzędzia Java
źródło
Lub możesz użyć:
co ma tę zaletę, że nie wymaga pakowania
try ... catch
.źródło
Jeśli używasz Kotlina i coroutines , możesz po prostu to zrobić
A jeśli musisz zaktualizować interfejs użytkownika
źródło
Wiem, że to stary wątek, ale w dokumentacji Androida znalazłem rozwiązanie, które działało dla mnie bardzo dobrze ...
https://developer.android.com/reference/android/os/CountDownTimer.html
Mam nadzieję, że to pomoże komuś ...
źródło
Aby mieć pewność, że można go połączyć z metodą „klasy statycznej”, jak opisano w odpowiedzi tronmana
źródło