
Rajapandisch
Ich habe eine Anwendung entwickelt, um Text in definierten Intervallen auf dem Bildschirm des Android-Emulators anzuzeigen. Ich benutze die Handler
Klasse. Hier ist ein Ausschnitt aus meinem Code:
handler = new Handler();
Runnable r = new Runnable() {
public void run() {
tv.append("Hello World");
}
};
handler.postDelayed(r, 1000);
Wenn ich diese Anwendung starte, wird der Text nur einmal angezeigt. Warum?

alex2k8
Die einfache Lösung für Ihr Beispiel ist:
handler = new Handler();
final Runnable r = new Runnable() {
public void run() {
tv.append("Hello World");
handler.postDelayed(this, 1000);
}
};
handler.postDelayed(r, 1000);
Oder wir können zum Beispiel normales Garn verwenden (mit Original Runner):
Thread thread = new Thread() {
@Override
public void run() {
try {
while(true) {
sleep(1000);
handler.post(this);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
thread.start();
Sie können Ihr ausführbares Objekt einfach als einen Befehl betrachten, der zur Ausführung an die Nachrichtenwarteschlange gesendet werden kann, und einen Handler nur als ein Hilfsobjekt, das zum Senden dieses Befehls verwendet wird.
Weitere Einzelheiten finden Sie hier http://developer.android.com/reference/android/os/Handler.html

Benutzer2212515
new Handler().postDelayed(new Runnable() {
public void run() {
// do something...
}
}, 100);

NguyenDat
Ich denke, dass die erste Lösung von Alex2k8 für das Update jede Sekunde verbessert werden kann
1.Originalcode:
public void run() {
tv.append("Hello World");
handler.postDelayed(this, 1000);
}
2. Analyse
- Nehmen Sie bei den oben genannten Kosten an
tv.append("Hello Word")
Kosten T Millisekunden, nach Anzeige 500 mal verspätete Zeit ist 500*T Millisekunden
- Es erhöht sich verzögert, wenn es lange läuft
3. Lösung
Um dies zu vermeiden, ändern Sie einfach die Reihenfolge von postDelayed(), um Verzögerungen zu vermeiden:
public void run() {
handler.postDelayed(this, 1000);
tv.append("Hello World");
}

Zar E. Ahmer
Für sich wiederholende Aufgaben können Sie verwenden
new Timer().scheduleAtFixedRate(task, runAfterADelayForFirstTime, repeaingTimeInterval);
nenne es wie
new Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
}
},500,1000);
Der obige Code wird danach zum ersten Mal ausgeführt halbe Sekunde (500) und wiederholt sich nach jedem Sekunde (1000)
Woher
Aufgabe die auszuführende Methode ist
nach dem die Zeit bis zur ersten Ausführung
(Intervall die Zeit für die Wiederholung der Ausführung)
Zweitens
Und Sie können auch verwenden CountDownTimer wenn Sie eine Aufgabe mehrmals ausführen möchten.
new CountDownTimer(40000, 1000) { //40000 milli seconds is total time, 1000 milli seconds is time interval
public void onTick(long millisUntilFinished) {
}
public void onFinish() {
}
}.start();
//Above codes run 40 times after each second
Und Sie können es auch mit Runnable tun. Erstellen Sie eine lauffähige Methode wie
Runnable runnable = new Runnable()
{
@Override
public void run()
{
}
};
Und nennen Sie es auf diese beiden Arten
new Handler().postDelayed(runnable, 500 );//where 500 is delayMillis // to work on mainThread
ODER
new Thread(runnable).start();//to work in Background

iTech
Ich glaube, für diesen typischen Fall, dh etwas mit einem festen Intervall auszuführen, Timer
ist angemessener. Hier ist ein einfaches Beispiel:
myTimer = new Timer();
myTimer.schedule(new TimerTask() {
@Override
public void run() {
// If you want to modify a view in your Activity
MyActivity.this.runOnUiThread(new Runnable()
public void run(){
tv.append("Hello World");
});
}
}, 1000, 1000); // initial delay 1 second, interval 1 second
Verwenden Timer
hat wenige vorteile:
- Anfängliche Verzögerung und das Intervall können einfach im angegeben werden
schedule
Funktionsargumente
- Der Timer kann durch einfaches Aufrufen gestoppt werden
myTimer.cancel()
- Wenn Sie nur einen Thread laufen lassen möchten, denken Sie daran, anzurufen
myTimer.cancel()
Vor Planen eines neuen (wenn myTimer nicht null ist)

Dzhuneyt
Handler handler=new Handler();
Runnable r = new Runnable(){
public void run() {
tv.append("Hello World");
handler.postDelayed(r, 1000);
}
};
handler.post(r);
Kotlin
private lateinit var runnable: Runnable
override fun onCreate(savedInstanceState: Bundle?) {
val handler = Handler()
runnable = Runnable {
// do your work
handler.postDelayed(runnable, 2000)
}
handler.postDelayed(runnable, 2000)
}
Java
Runnable runnable;
Handler handler;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
handler = new Handler();
runnable = new Runnable() {
@Override
public void run() {
// do your work
handler.postDelayed(this, 1000);
}
};
handler.postDelayed(runnable, 1000);
}
9641300cookie-checkWie führe ich einen Runnable-Thread in Android in definierten Intervallen aus?yes
Ich kann mich nie erinnern, wie man ein Runnable macht, also besuche ich immer Ihren Beitrag, wie es geht :))
– Adrian Sicaru
4. August 2015 um 11:01 Uhr
Lambdas sind jetzt meistens der richtige Weg 😉
– xeruf
2. Juli 2017 um 21:22 Uhr