Wie pause / Schlaf-thread oder Prozess in Android?
Möchte ich um eine pause zwischen zwei Zeilen code, Lassen Sie mich erklären, ein wenig:
-> klickt der Benutzer auf einen button (eine Karte, in der Tat) und ich zeige es, indem Sie den hintergrund dieser button:
thisbutton.setBackgroundResource(R.drawable.icon);
-> nach sagen wir mal 1 Sekunde, die ich brauche, um wieder den vorherigen Status der Schaltfläche Wechsel seinen hintergrund:
thisbutton.setBackgroundResource(R.drawable.defaultcard);
-> ich habe versucht, auf pause den Faden zwischen diesen beiden code-Zeilen mit:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
Jedoch, funktioniert dies nicht. Vielleicht ist es der Prozess und nicht der Thread ist, dass ich eine pause benötigen?
Ich hab auch schon versucht (funktioniert aber nicht):
new Reminder(5);
Mit dabei:
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
}
}
}
Wie kann ich pause/schlafen, wird der thread oder Prozess?
Ich bin nicht sicher, ob du sarkastisch oder in der Tat gibt es einige Dalvik/Android magic so, dass dies akzeptabel ist, auf Android. Können Sie bitte klären? Sorry für die geplagten, aber ich Frage, weil während
(!conditionCheck()) {}
wird in der Regel abgeraten."Aber das funktioniert nicht." "Ich hab auch schon versucht (funktioniert aber nicht)" Das ist ein klassisches Beispiel zu sagen, dass es ein problem ohne Angabe der Symptome. Auf welche Weise haben diese versuche fehlschlagen, um Ihre Anforderungen zu erfüllen? Hab den thread nicht unterbrechen? Hast du eine Fehlermeldung bekommen?
InformationsquelleAutor Hubert | 2009-10-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine Lösung für dieses problem ist die Verwendung der Handler.postDelayed() Methode. Einige Google - Schulungsunterlagen schlagen die gleiche Lösung.
Allerdings haben einige darauf hingewiesen, dass die Lösung oben ein Speicherverlust verursacht, weil es verwendet eine nicht-statische innere und anonyme Klassen, die implizit einen Verweis auf die äußere Klasse, die Aktivität. Dies ist ein problem, wenn die Aktivität der Kontext wird Müll gesammelt.
Eine komplexere Lösung, die vermeidet, dass der Speicherverlust Unterklassen der
Handler
undRunnable
mit statischen inneren Klassen innerhalb der Aktivität, da statische innere Klassen nicht halten eine implizite Referenz auf die äußere Klasse:Beachten Sie, dass die
Runnable
verwendet eine WeakReference, um die Aktivität, die notwendig ist, eine statische Klasse, die benötigt Zugriff auf die Benutzeroberfläche.Ich bin mir nicht sicher, was Sie meinen "unbequemen". Die Hf postDelayed Methode ist entworfen, um zu sagen, Android, die Sie wollen, ein Stück code, der ausgeführt werden soll, nachdem eine bestimmte Zeit vergangen ist.
nach 2 Jahren und dieser code hat mir gerade geholfen! danke @tronman!! 🙂
Sie können einfach kopieren Sie es auf einen anderen (final) variable wie so
final Button mynewbutton = mybutton;
und verwendenmynewbutton
im Handler und Runnable von dort aus auf.nach 5 Jahren und dieser code hat mir gerade geholfen! 🙂
InformationsquelleAutor tronman
Können Sie versuchen, das man es kurze
WARNUNG: Nie, nie, tun Sie dies auf einem UI-thread.
Verwenden Sie diese, um zu schlafen zB. hintergrund-thread.
Vollständige Lösung für Ihr problem sein:
Dieser steht den API-1
Ohne erstellen tmp-Handler. Auch diese Lösung ist besser als @tronman, weil wir nicht behalten, Ansicht von Handler.
Auch wir haben Sie nicht problem mit Handler erstellt am schlechten thread 😉
Dokumentation
Code für postDelayed von der View-Klasse:
OMG-natürlich dabei im hintergrund-thread.
Strg + Shift + O (Eclipse-auto-import)
Gelldur, Sie sind fehlt den Punkt von @RichieHH Kommentar. Im Vergleich zu den die Antwort akzeptiert wurde 3 Jahre bevor Sie veröffentlicht, was Sie vorschlagen, hilft nicht OP sein problem zu lösen. Grund: Der code, die beide, wie gezeigt, durch OP, und, wie gezeigt, in der akzeptierten Antwort, ausgeführt wird, innerhalb eines UI-handler. Sagen
OMG of course do this in background thread
ist irrelevant, es sei denn, Sie zeigen, WIE man es im hintergrund-thread. Zu welcher Zeit, werden Sie entdecken, dass Sie eine Antwort haben, komplizierter als die bereits akzeptierten Antworten. Habe ich schon erwähnt, dass eine bessere Lösung akzeptiert wurde vor drei Jahren? 😛... vergessen zu erwähnen, dass das, was macht diesen Vorschlag besonders off-Zweck um die Frage, ist das OP explizit machen will UI-Aktion die nach der Verzögerung. Also, Sie hätten eine Lösung, in der Sie erstellt haben, einen hintergrund-thread (bereits mehr schwere als notwendig, um das problem zu lösen), geschlafen, und dann haben Sie (irgendwie) zurück an den UI-thread.
Handler + postRunnable
leistet all dies in einem einzigen Schritt. Ohne den system-overhead für das erzeugen von zweiten thread.InformationsquelleAutor Dawid Drozd
Benutze ich dieses:
e.getLocalizedMessage()
tun sollen?ich benutze e.getLocalizedMessage (), wenn ich einen einfachen, Allgemeinen und schnellen Ausnahmemeldung
Aber ich Wette, Sie tun dieses nicht in der situation, die OP fragt nach, innerhalb eines UI-Klick-Methode ist, wird weitere updates für die UI. Die akzeptierte
Handler/postDelayed
Lösung hat zwei Vorteile: (1) vermeidet overhead-system der 2. thread, (1) läuft auf UI-thread, also können Sie machen änderungen an der Benutzeroberfläche, ohne dass eine Ausnahme.natürlich müssen Sie anrufen closeActivity.start();
Nicht direkt mit dem wichtigsten Ziel, die Frage, aber Sie sollten nicht fangen die Ausnahme. Eher fangen InterruptedException. Durch den Fang Ausnahme, Sie fangen alles, was schief gehen kann, wodurch Probleme, die Sie sonst erwischt.
InformationsquelleAutor Byt3
Werden Sie wahrscheinlich nicht wollen, es zu tun auf diese Weise. Indem Sie eine explizite
sleep()
in Ihrem Knopf-Klick-Ereignis-handler, würden Sie eigentlich sperren, bis die gesamte Benutzeroberfläche für eine Sekunde. Eine alternative ist die Verwendung von irgendeiner Art von single-shot -Timer. Erstellen Sie eine TimerTask ändern Sie die Hintergrundfarbe wieder auf den Standard-Farbe, und planen, es auf die Timer.Andere Möglichkeit ist die Verwendung eines Handler. Es gibt ein tutorial über jemanden, der aus geschaltet über eine Zeitschaltuhr mit einem Handler.
Kann man übrigens nicht anhalten eines Prozesses. Ein Java - (oder Android) - Prozess hat mindestens 1 thread, und Sie können nur schlafen-threads.
InformationsquelleAutor Daniel Yankowsky
Benutze ich CountDownTime
InformationsquelleAutor vudandroid
Dies ist, was ich Tat, am Ende des Tages funktioniert jetzt :
InformationsquelleAutor Hubert
Neben Mr. Yankowsky Antworten, Sie können auch
postDelayed()
. Diese ist auf jedemView
(z.B. der Karte) und nimmt eineRunnable
und eine delay-Zeit. Es führt dieRunnable
nach, die Verzögerung.InformationsquelleAutor CommonsWare
Dies ist mein Beispiel
Erstellen Sie ein Java-Utils
Auf der UX-Seite der Dinge, zeigt ein Dialogfeld mit einer Sperre für den Benutzer, um Daten zu laden ist ... nicht gut.
InformationsquelleAutor Stefano
Oder Sie verwenden könnten:
den Vorteil hat, die nicht erfordern eine Umhüllung
try ... catch
.InformationsquelleAutor aaaa
Wenn Sie Kotlin und Coroutinen, Sie können einfach tun
Und wenn Sie benötigen, um update-UI
InformationsquelleAutor Guillaume
Ich weiß, dies ist ein Alter thread, aber in der Android-Dokumentation ich habe eine Lösung gefunden, die funktionierte sehr gut für mich...
https://developer.android.com/reference/android/os/CountDownTimer.html
Hoffe, das jemand hilft...
InformationsquelleAutor John Byrne