Wie man ein Android-Programm 'warten' macht

8

Ich möchte, dass mein Programm für eine bestimmte Anzahl von Millisekunden anhält, wie genau würde ich das tun?

Ich habe verschiedene Möglichkeiten wie Thread.sleep( time ) gefunden, aber ich glaube nicht, dass ich das brauche. Ich will nur, dass mein Code für x Millisekunden an einer bestimmten Zeile pausiert. Irgendwelche Ideen würden sehr geschätzt werden.

Dies ist der ursprüngliche Code in C ...

%Vor%

wait ist eine Anzahl von Millisekunden

    
JuiCe 18.07.2012, 19:27
quelle

7 Antworten

9

OK, zuallererst, implementieren Sie niemals eine Verzögerung mit einer aktiven Schleife, wie Sie es tun. Ich kann sehen, woher das kommt - ich nehme an, dass der Palm-Pilot ein Single-Process-Gerät ohne eingebaute sleep () -Funktion war, aber bei einem Multi-Prozess-Gerät bringt ein solcher Loop nur das Ganze Prozessor in die Knie. Es tötet Ihren Akku, verhindert, dass normale Systemaufgaben ordnungsgemäß ausgeführt werden, verlangsamt andere Programme oder stoppt sie vollständig, lässt das Gerät nicht mehr reagieren und kann sogar dazu führen, dass es in Ihren Händen heiß wird.

Der Aufruf, nach dem Sie suchen, ist Thread.sleep (). Sie müssen festlegen, dass alle Unterbrechungsausnahmen, die während des Schlafens auftreten, abgefangen werden.

Zweitens, bei ereignisbasierten Benutzeroberflächen wie Android (oder so ziemlich jedem modernen GUI-System) möchten Sie niemals im UI-Thread schlafen. Das wird auch das gesamte Gerät einfrieren und zu einem ANR (Activity Not Responding) Crash führen, wie andere Poster erwähnt haben. Vor allem ruinieren diese kleinen Freezes die Benutzererfahrung völlig.

(Ausnahme: Wenn Sie für kurze Intervalle schlafen, die der Benutzer wahrscheinlich nicht bemerken wird, können Sie damit durchkommen. 1/4 Sekunde ist wahrscheinlich in Ordnung, obwohl es je nach Situation die Anwendung janky machen kann .)

Leider gibt es keinen sauberen und eleganten Weg, um das zu tun, was Sie wollen, wenn Sie eine schleifenbasierte Anwendung auf ein ereignisbasiertes System portieren.

Das heißt, die richtige Vorgehensweise besteht darin, einen Handler in Ihrem UI-Thread zu erstellen und verzögerte Nachrichten an ihn zu senden. Die verzögerten Nachrichten "wecken" Ihre Anwendung und veranlassen sie, nach der Verzögerung auszuführen, was auch immer sie tun würde.

In etwa so:

%Vor%     
Edward Falk 18.07.2012, 23:18
quelle
16

Sie sollten den UI-Thread wirklich nicht so ausschlafen. Ihre Anwendung wird wahrscheinlich mit der ActivityNotResponding-Ausnahme geschlossen, wenn Sie dies tun.

Wenn Sie die Ausführung von Code für eine bestimmte Zeit verzögern möchten, verwenden Sie einen Runnable und einen Handler wie folgt:

%Vor%

Auf diese Weise wird Ihr Code immer noch verzögert, aber Sie "frieren" den UI-Thread nicht, was bestenfalls zu einer schlechten Performance und im schlimmsten Fall zu einer ANR-Force führen würde.

    
FoamyGuy 18.07.2012 19:48
quelle
3

Machen Sie etwas wie folgt. Hier ist ein Link zu der Referenz , dies könnte hilfreich sein.

%Vor%     
prolink007 18.07.2012 19:30
quelle
1

Nicht sicher, warum das Programm angehalten werden soll. Wenn Sie eine Aufgabe im Hintergrund ausführen und die Ergebnisse verwenden möchten, sehen Sie sich AsyncTask an. Ich hatte eine Weile eine ähnliche Frage zurück.

    
primpap 18.07.2012 19:35
quelle
1

Das SystemClock.sleep (Millis) ist eine Dienstprogrammfunktion, die Thread.sleep (Millis) sehr ähnlich ist, aber InterruptedException ignoriert.

    
Ken 15.09.2016 22:00
quelle
0

Ich denke Thread.sleep (....) ist wahrscheinlich das, was Sie wollen, dass Sie es vielleicht nicht richtig machen. Was genau willst du pausieren? Hoffentlich nicht der UI-Thread? Ich nehme an, Sie haben einen Hintergrund-Thread, der einige Aufgaben in irgendeiner Art von Intervall ausführt? Wenn dies der Fall ist, wird Thread.sleep diesen bestimmten Thread für eine bestimmte Zeit in den Ruhezustand versetzen, es wird jedoch nicht alle Threads pausieren.

    
Jon Taylor 18.07.2012 19:29
quelle
0
%Vor%     
rmoore 29.04.2017 05:11
quelle

Tags und Links