Wie man ein Android-Programm 'warten'
Möchte ich, daß mein Programm zu unterbrechen, für eine bestimmte Anzahl von Millisekunden, wie genau ich dies tun?
Habe ich verschiedene Wege gefunden, wie Thread.sleep( time )
, aber ich glaube nicht, dass das ist, was ich brauche. Ich will nur meinen code anhalten an einer bestimmten Linie für x Millisekunden. Irgendwelche Ideen würde sehr geschätzt werden.
Dies ist der ursprüngliche code in C...
extern void delay(UInt32 wait){
UInt32 ticks;
UInt32 pause;
ticks = TimGetTicks();
//use = ticks + (wait/4);
pause = ticks + (wait);
while(ticks < pause)
ticks = TimGetTicks();
}
warten, ist ein Betrag von Millisekunden
- Haben Sie noch nicht genug Informationen. Erklären, was dein code macht und warum es braucht, um zu warten/pause.
- Versucht zum anhalten der Haupt-thread der Anwendung würde wahrscheinlich auslösen ANR. Wenn Sie uns sagen, was Sie zu tun versuchen, gibt es vielleicht eine bessere Lösung als die Sperrung der thread.
- Haha, ich weiß nicht einmal wirklich wissen, warum. Ich bin der Konvertierung ein Palm Pilot-Programm, um Android, und es hat eine "delay" - Funktion, ich werde Bearbeiten Sie meinem ursprünglichen Beitrag und zeigen Sie den C-code.
- Aber was ist der Punkt der, dass
delay
Verfahren? Wo wird es verwendet in der rest des Codes und für welchen Zweck? - Ich weiß es wirklich nicht, ich werde die Frage schließen. Ich brauche, um herauszufinden, mehr über das, was Los ist, bevor ich es Fragen. Was ich sagen kann, es ist buchstäblich nur macht das Programm warten, es gibt keine Aufrufe von anderen threads, bevor die hand.
Du musst angemeldet sein, um einen Kommentar abzugeben.
OK, Erstens, nicht implementieren eine Verzögerung mit einer busy-loop, als du tust. Ich kann sehen, Woher das kommt-ich vermute, dass der palm pilot war ein single-Prozess-Gerät ohne eingebaute sleep () - Funktion, aber auf einer multi-Prozess-Gerät, eine busy-loop wie, die bringt nur der gesamte Prozessor in die Knie. Es tötet die Batterie, verhindert die normale system-tasks ordnungsgemäß ausgeführt, verlangsamt andere Programme oder Stoppt Sie ganz, macht das Gerät nicht mehr reagiert, und kann sogar dazu führen, dass es zu heiß in Ihren Händen.
Den Anruf, den Sie suchen, ist Thread.sleep(). Sie müssen zu fangen Unterbrechung die Ausnahmen, die auftreten, während Sie schlafen.
Zweite, mit Ereignis-basierte Benutzer-Schnittstellen wie Android (oder so ziemlich alle modernen GUI-system), die Sie nie schlafen wollen in den UI-thread. Das wird auch einfrieren, das gesamte Gerät und das Ergebnis in eine ANR (Aktivität Nicht mehr Reagiert) - crash, wie die anderen Poster erwähnt haben. Am wichtigsten ist, diese kleinen freezes völlig ruinieren die user experience.
(Ausnahme: wenn Sie schlafen, bei so kurzen Zeitabständen, dass der Benutzer wahrscheinlich nicht bemerken, Sie können mit ihm Weg erhalten. 1/4 Sekunde ist wohl ok, obwohl es die Anwendung mit der kitschige je nach situation.)
Leider gibt es keine saubere und elegante Möglichkeit, das zu tun, was Sie wollen, wenn das, was Sie tun, ist die Portierung einer loop-basierte Anwendung, um ein event-basiertes system.
Sagte, die richtige Vorgehensweise ist das erstellen eines handler im UI thread und verzögert senden von Nachrichten an. Die verzögerte Nachrichten "wake up" Ihrer Anwendung, und lösen Sie es ausführen, was es im Begriff war zu tun, nach der Verzögerung.
Etwas wie dieses:
Sollten Sie wirklich nicht schlafen, der UI-thread wie diesem, sind Sie wahrscheinlich, um Ihre Anwendung zwingen, zu schließen mit ActivityNotResponding Ausnahme, wenn Sie dies tun.
Wenn Sie wollen, zu verzögern, einige code ausgeführt, für eine gewisse Zeit verwenden Sie einen Lauffähigen und einen Handler wie diese:
Diese Weise Ihr code wird immer noch verzögert, aber Sie sind nicht "einfrieren" der UI-thread dazu führen würde, dass die schlechte Leistung am besten, und ANR force close im schlimmsten Fall.
Etwas wie die folgende. Hier ist ein link zu der Referenz, könnte dies hilfreich sein.
Können Sie die
Handler
Klasse und diepostDelayed()
Methode zu tun:2000 ms ist die verzögerte Zeit vor der Ausführung von code innerhalb der Funktion
Nicht sicher, warum Sie wollen, das Programm zu unterbrechen. In Fall, dass Sie wollen einige Aufgabe in den hintergrund und verwenden Sie die Ergebnisse, betrachten Sie AsyncTask. Ich hatte eine ähnliche Frage eine Weile zurück.
Den SystemClock.sleep(millis) ist eine utility-Funktion sehr ähnlich zu dem Thread.sleep(millis), aber es ignoriert InterruptedException.
Ich denke Thread.Schlaf(....) wahrscheinlich ist das, was Sie wollen, Sie können nur nicht tun es richtig. Was genau versuchen Sie zu unterbrechen? Hoffentlich nicht der UI-thread? Ich vermute, Sie haben einige hintergrund-thread ausführen einiger Aufgaben in einer Art Intervall? Wenn ja, dann Thread.Schlaf, legen Sie diesen bestimmten thread für eine bestimmte Zeit, es wird jedoch nicht anhalten aller threads.