Android
Treser
Szukaj…
Uwagi
Program obsługi może być łatwo wykorzystany do wykonania kodu po pewnym czasie. Jest także przydatny do wielokrotnego wykonywania kodu po określonym czasie przez ponowne wywołanie metody Handler.postDelayed () z poziomu metody run () Runnable.
Użycie modułu obsługi do wykonania kodu po pewnym czasie
Wykonanie kodu po 1,5 sekundy:
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//The code you want to run after the time is up
}
}, 1500); //the time you want to delay in milliseconds
Wykonywanie kodu wielokrotnie co 1 sekundę:
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
handler.postDelayed(this, 1000);
}
}, 1000); //the time you want to delay in milliseconds
HandlerThreads i komunikacja między wątkami
Jak Handler
są wykorzystywane s aby wysłać Message
e i Runnable
s do kolejki komunikatów wątku jest łatwo wdrożyć komunikację opartą zdarzeń między wieloma wątkami. Każdy wątek posiadający Looper
może odbierać i przetwarzać wiadomości. HandlerThread
to wątek, który implementuje taki Looper
, na przykład główny wątek (wątek interfejsu użytkownika) implementuje funkcje HandlerThread
.
Tworzenie modułu obsługi dla bieżącego wątku
Handler handler = new Handler();
Tworzenie modułu obsługi dla głównego wątku (wątek interfejsu użytkownika)
Handler handler = new Handler(Looper.getMainLooper());
Wyślij Runnable z innego wątku do głównego wątku
new Thread(new Runnable() {
public void run() {
// this is executed on another Thread
// create a Handler associated with the main Thread
Handler handler = new Handler(Looper.getMainLooper());
// post a Runnable to the main Thread
handler.post(new Runnable() {
public void run() {
// this is executed on the main Thread
}
});
}
}).start();
Tworzenie modułu obsługi dla innego klucza wątku i wysyłanie do niego zdarzeń
// create another Thread
HandlerThread otherThread = new HandlerThread("name");
// create a Handler associated with the other Thread
Handler handler = new Handler(otherThread.getLooper());
// post an event to the other Thread
handler.post(new Runnable() {
public void run() {
// this is executed on the other Thread
}
});
Zatrzymaj moduł obsługi przed wykonaniem
Aby zatrzymać moduł obsługi przed usunięciem, usuń dołączone do niego wywołanie zwrotne za pomocą uruchomionego w nim programu:
Runnable my_runnable = new Runnable() {
@Override
public void run() {
// your code here
}
};
public Handler handler = new Handler(); // use 'new Handler(Looper.getMainLooper());' if you want this handler to control something in the UI
// to start the handler
public void start() {
handler.postDelayed(my_runnable, 10000);
}
// to stop the handler
public void stop() {
handler.removeCallbacks(my_runnable);
}
// to reset the handler
public void restart() {
handler.removeCallbacks(my_runnable);
handler.postDelayed(my_runnable, 10000);
}
Użyj modułu obsługi, aby utworzyć licznik czasu (podobny do javax.swing.Timer)
Może to być przydatne, jeśli piszesz grę lub coś, co wymaga wykonania kodu co kilka sekund.
import android.os.Handler;
public class Timer {
private Handler handler;
private boolean paused;
private int interval;
private Runnable task = new Runnable () {
@Override
public void run() {
if (!paused) {
runnable.run ();
Timer.this.handler.postDelayed (this, interval);
}
}
};
private Runnable runnable;
public int getInterval() {
return interval;
}
public void setInterval(int interval) {
this.interval = interval;
}
public void startTimer () {
paused = false;
handler.postDelayed (task, interval);
}
public void stopTimer () {
paused = true;
}
public Timer (Runnable runnable, int interval, boolean started) {
handler = new Handler ();
this.runnable = runnable;
this.interval = interval;
if (started)
startTimer ();
}
}
Przykładowe użycie:
Timer timer = new Timer(new Runnable() {
public void run() {
System.out.println("Hello");
}
}, 1000, true)
Ten kod będzie drukował „Witaj” co sekundę.