2009-10-29 6 views
5

Ich möchte einen Thread mit einem bestimmten Zeitintervall automatisch planen. Ich muss das auch im Hintergrund kontinuierlich ausführen, ohne an das Gerät zu hängen.Wie kann ich einen bestimmten Thread in Blackberry planen

Ich habe dies mit Application Manager Class versucht, aber es ist für die Anwendungsplanung und ich muss Thread innerhalb der Anwendung planen.

Antwort

6

würde ich TimerTask verwenden:

public class MyScreen extends MainScreen { 
    private Timer mTimer; 
    public MyScreen() {   
     mTimer = new Timer(); 
     //start after 1 second, repeat every 5 second 
     mTimer.schedule(mTimerTask, 0, 5000); 
    } 

    TimerTask mTimerTask = new TimerTask() { 
     public void run() { 
      // some processing here 
     } 
    }; 
} 

siehe BlackBerry API Hidden Gems (Part Two)

0

Solange die Anwendung läuft - erstellen Sie einfach den Thread und nach jedem Bit der Arbeit Anruf Thread.sleep für so lange wie Sie es brauchen, um ruhend zu bleiben.

Wenn Sie es brauchen bis zu einer bestimmten Zeit zu wecken, und nicht nur für eine bestimmte Zeit zu schlafen, dann kann man in etwa wie folgt tun:

Date wakeUpAt = ...; // Get this however 
Date now = new Date(); 
long millisToSleepFor = wakeUpAt.getTime() - now.getTime(); 
Thread.sleep(millisToSleepFor); 
+0

Danke, aber im Schlaf hängt es für bestimmte Zeit (lange millisToSleepFor) Zeit. – Rishabh

+0

Willst du sagen, dass das Gerät keine anderen Threads plant, während der Thread schläft? Der ganze Punkt von sleep() ist, dass der Thread für diese Zeit nicht auf der CPU geplant ist ... –

2

Verwendung UiApplication.getUiApplication().invokeLater() es akzeptiert eine Verzögerung und Parameter wiederholen und genau das ausführen, was Sie brauchen.

EDIT

Ich weiß, dass dieser Beitrag ist alt, aber das ist bei weitem die beste Option zu wiederholen, Ereignisse zu planen, und ich möchte hinzufügen, dass die im Anschluss an die geplante Ereignis zu stoppen ist erforderlich:

//Start repeating "runnable" thread every 10 seconds and save the event ID 
int eventId = UiApplication.getUiApplication().invokeLater(runnable, 10000, true); 

//Cancel the repetition by the saved ID 
UiApplication.getUiApplication().cancelInvokeLater(eventId); 
+0

Richtig, aber gibt es einen Weg, den Thread nach dem Beenden der Anwendung mit einer gegebenen Verzögerung zu starten, zum Beispiel Verzögerung von 1 Tag. – Rishabh

+0

können Sie UiApplication.getUiApplication() hinzufügen. RequestBackground(); Wenn Sie die onClose() -Methode überschreiben, wird die Anwendung im Hintergrund ausgeführt, aber (afaik) wird jeder Thread, den Sie aus dem Anwendungskontextsichtpunkt starten, beendet, nachdem er ordnungsgemäß geschlossen wurde, einschließlich geplanter Threads. – Lisandro

1

Angenommen, Sie möchten, dass beim Start des Geräts ein Thread ausgeführt wird: Erstellen Sie ein zweites Projekt, und listen Sie es als alternativen Einstiegspunkt auf. Überprüfen Sie in Ihrer UiApplication oder Application main() das an das Projekt übergebene Argument. Mach deine periodischen Sachen dort über Thread.sleep und rufe nicht enterEventDispatcher auf.

Suche nach „Autostart“: http://docs.blackberry.com/en/developers/deliverables/1076/development.pdf

Oder wenn Sie etwas einmal ein Benutzer tun wollen „beginnt“ es, dann schauen Sie in einen neuen Thread zu schaffen Ihr Timing Dinge zu tun. Überschreibe onClose() deines Bildschirms und benutze Application.getActivation(). Disable(), um den Bildschirm in den Hintergrund zu werfen.

Oder es gibt eine andere Möglichkeit, etwas wie invokeLater, etc. zu tun. Vielleicht Eventlistener tun können, was Sie brauchen, aber Sie haben nicht viele Details gegeben.

Verwandte Themen