2012-04-06 3 views
1

ich einen Thread in einer Android-Anwendung, die ich entweder an einem bestimmten Punkt in ihrem Betrieb warten möchte:Android - Thread warten Benachrichtigung oder Timeout * in Echtzeit machen *

  1. Eine Mitteilung von ein anderer Thread oder
  2. Ein Timeout auftreten, die ich in Echtzeit angeben möchte.

Derzeit habe ich (in etwa) folgende:

... 
doStuff(); 
synchronized(this) { 
    if (!notificationReceived) wait(TIMEOUTPERIOD); 
} 
doMoreStuff(); 
... 

und in einem Verfahren von einem anderen Thread aufgerufen:

synchronized(this) { 
    notificationReceived = true; 
    notifyAll(); 
} 

Diese fast funktioniert. Tatsächlich funktionierte es bis zum Debuggen und Testen und funktionierte erst, als ich versuchte, die Anwendung im Feld bereitzustellen. Weil es sich herausstellt, dass der Timer in Object.wait() stoppt, wenn die Telefon-CPU in den Ruhezustand geht. Wie auch in Thread.sleep(). Hoppla.

Nun, es macht mir nichts aus, dass der Anruf nicht zurückkehrt, während das Telefon schläft (tatsächlich halte ich das für wünschenswert - die Ergebnisse der Aktion sind zu keinem Zeitpunkt erforderlich, wenn das Telefon schläft), Aber wenn das Telefon für die Dauer meiner Timeout-Zeit schläft, möchte ich, dass die Aktion ausgelöst wird, sobald sie aufwacht.

Gibt es irgendeine Möglichkeit, die ich vermisse, dies zu tun? Ich weiß, ich könnte AlarmManager verwenden, um mir eine Broadcast Intent nach der erforderlichen Zeit zu senden, und legte den Fortsetzungscode in einem (was ...? BroadcastReceiver? Ich habe das noch nie getan ...), aber das würde wesentlich komplizieren die Logik meiner Anwendung. Also: Gibt es einen einfacheren Weg, wie ich eine (kündbare) Echtzeitverzögerung in meinen Thread setzen kann?

Antwort

0

Ich löste dieses Problem, indem ich einen BroadcastReceiver dynamisch registrierte, der einen Verweis auf das Objekt hatte, das ich benachrichtigen wollte, und es NotifyAll() aufrufen, wenn es eine Übertragung empfing. Ich habe dann den AlarmManager verwendet, um vor jedem wartenden Aufruf() Alarme für ihn einzurichten und die Alarme nach einer Wartezeit, die nicht auf ein Zeitlimit zurückzuführen war, zurückgestellt.

Ich denke, dass es in meinem Code eine Race Condition geben kann, wo eine Zeitüberschreitung ungefähr zur gleichen Zeit wie eine externe Benachrichtigung auftritt, aber in meinem Fall habe ich entschieden, dass es keine doppelte Benachrichtigung von Zeit zu Zeit gibt.