388 Stimmen

Wie kann man einen Runnable Thread in Android in bestimmten Intervallen ausführen?

Ich habe eine Anwendung entwickelt, die einen Text in bestimmten Abständen auf dem Bildschirm des Android-Emulators anzeigt. Ich verwende 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 ausführe, wird der Text nur einmal angezeigt. Warum?

131 Stimmen

Ich kann mich nie daran erinnern, wie man einen Runnable macht, also besuche ich immer Ihren Beitrag darüber, wie man es macht :))

1 Stimmen

Lambdas sind jetzt der Weg zu gehen die meiste Zeit ;)

18voto

singh arjun Punkte 179
Handler handler=new Handler();
Runnable r = new Runnable(){
    public void run() {
        tv.append("Hello World");                       
        handler.postDelayed(r, 1000);
    }
}; 
handler.post(r);

5 Stimmen

Dies sollte einen Fehler ergeben. In Ihrer zweiten Zeile rufen Sie die Variable r die noch nicht definiert ist.

0 Stimmen

Wenn Sie sicher sein wollen, dass der Handler an den Hauptthread angehängt wird, sollten Sie ihn wie folgt initialisieren: handler = new Handler(Looper.getMainLooper());

0 Stimmen

Nur eine sich wiederholende Antwort!

6voto

Khemraj Sharma Punkte 52006

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);
}

0 Stimmen

Wie können wir andere Funktionen innerhalb von Runnable ausführen?

4voto

Damian Walczak Punkte 1324

Wenn ich die Dokumentation der Methode Handler.post() richtig verstehe:

Bewirkt, dass das Runnable r der Nachrichtenwarteschlange hinzugefügt wird. Die Runnable wird auf dem Thread ausgeführt, an den dieser Handler angehängt ist.

Die von @alex2k8 angegebenen Beispiele funktionieren zwar korrekt, sind aber nicht identisch. In dem Fall, wo Handler.post() verwendet wird, keine neuen Themen erstellt werden . Sie posten einfach Runnable zum Thema mit Handler ausgeführt werden von EDT . Danach führt der EDT nur noch Runnable.run() und sonst nichts.

Erinnern Sie sich: Runnable != Thread .

1 Stimmen

Das ist wahr. Erstellen Sie nicht jedes Mal einen neuen Thread, niemals. Der Sinn von Handler und anderen Ausführungspools ist es, ein oder zwei Threads zu haben, die Aufgaben aus einer Warteschlange ziehen, um Thread-Erstellung und GC zu vermeiden. Wenn Sie eine wirklich undichte Anwendung haben, kann die zusätzliche GC helfen, OutOfMemory-Situationen zu überbrücken, aber die bessere Lösung in beiden Fällen ist es zu vermeiden, mehr Arbeit als nötig zu erstellen.

0 Stimmen

Ist es also besser, den normalen Thread auf der Grundlage der Antwort von alex2k8 zu verwenden?

2voto

Willi Mentzel Punkte 24707

Kotlin mit Coroutinen

In Kotlin können Sie mit Koroutinen Folgendes tun:

CoroutineScope(Dispatchers.Main).launch { // Main, because UI is changed
    ticker(delayMillis = 1000, initialDelayMillis = 1000).consumeEach {
        tv.append("Hello World")
    }
}

Probieren Sie es aus ici !

1voto

Ein interessantes Beispiel ist ein Zähler/Stoppuhr, der in einem separaten Thread läuft. Außerdem wird die GPS-Position angezeigt. Während die Hauptaktivität User Interface Thread ist bereits da.

Auszug:

try {    
    cnt++; scnt++;
    now=System.currentTimeMillis();
    r=rand.nextInt(6); r++;    
    loc=lm.getLastKnownLocation(best);    

    if(loc!=null) { 
        lat=loc.getLatitude();
        lng=loc.getLongitude(); 
    }    

    Thread.sleep(100); 
    handler.sendMessage(handler.obtainMessage());
} catch (InterruptedException e) {   
    Toast.makeText(this, "Error="+e.toString(), Toast.LENGTH_LONG).show();
}

Den Code können Sie hier einsehen:

Thread-Beispiel zur Anzeige des GPS-Standorts und der aktuellen Uhrzeit, das neben dem Benutzeroberflächen-Thread der Hauptaktivität ausgeführt werden kann

1 Stimmen

Tipp: Wenn Sie Ihre Antwort sinnvoll gestalten wollen, sollten Sie lernen, wie Sie Ihre Eingaben formatieren. Das Vorschau Fenster gibt es aus einem bestimmten Grund.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X