Frage

Ich schreibe eine J2ME-Anwendung. Eines der Stücke ist etwas, das fragt den Inhalt eines Verzeichnisses in regelmäßigen Abständen, und, wenn es neue Dinge sind, malt sie auf dem Bildschirm. Ich habe dies getan, indem die Benutzeroberfläche Form eines Abrufthread mit einem Zeiger zurück auf sich selbst starten zu müssen, und wenn das Abrufthread etwas findet auf das Formular es ruft zurück und ruft eine syncrhonized Methode ist es Anzeige zu aktualisieren. Dies scheint gut zu funktionieren.

Die Frage, die ich habe, ist dies. In C # /. NET ich weiß, es ist nicht schön Nicht-UI-Threads Aktualisierung der Benutzeroberfläche zu haben, und der richtige Weg, dies zu umgehen ist es an den UI-Thread zu delegieren oben.

z. die folgenden:

public void DoSomeUIThing()
{
    if (this.uiComponent.InvokeRequired)
    {
        this.uiComponent.Invoke(someDelegateThatCallsBackToThis);
    }
    else
    {
        this.uiComponent.Text = "This is the update I want to happen";
    }
}

Gibt es ein J2ME Äquivalent dafür, wie dieser Prozess zu verwalten? Wie wäre es Java? Oder ist Java / J2ME spielt nur schöner in Bezug auf das? Wenn nicht, wie wird das gemacht?

[EDIT] Es scheint, dass Swing-unterstützt, was ich frage, über die SwingUtilities.invokeLater () und invokeAndWait () Methoden. Gibt es ein Äquivalent Rahmen für J2ME?

War es hilfreich?

Lösung

In Bezug auf Java, was Sie beschreiben, sieht aus wie ein Swingworker (Arbeiter-Thread) .

Wenn ein Swing-Programm braucht eine lang andauernde Aufgabe auszuführen, ist es in der Regel verwendet eine der Worker-Threads, die auch als Hintergrund-Threads bekannt.

Ein Swing-Programm umfasst die folgenden Arten von Themen:

  • Initial Threads, die Threads, die anfängliche Anwendungscode ausführen.
  • Der Event Dispatch Thread, in dem alle Ereignisbehandlungscode ausgeführt wird. Die meisten Code, der mit dem Swing-Rahmen zusammenwirkt, muss auch auf diesem Thread ausführen.
  • Worker-Threads, die auch als Hintergrund-Threads bekannt, bei denen zeitraubend Hintergrundaufgaben ausgeführt werden.

Single-Thread-Regel :
Sobald eine Swing-Komponente realisiert worden ist, alle Code, der auf den Zustand dieser Komponente beeinflussen oder abhängen könnten, sollten in der event-Dispatching Thread ausgeführt werden.

Wenn in einem J2EE-Kontext verwendet wird, müssen Sie vorsichtig sein, wenn Sie J2ME , es hängt wenn Sie Ihre Anwendung als Standard-MIDlet entwickeln, die auf jedem MIDP-fähiges Gerät oder zum Beispiel als RIMlet, eine CLDC-basierten Anwendung, die Blackberry-spezifische APIs verwendet und daher nur laufen laufen auf Blackberry-Geräten.

Denn im Gegensatz zu MIDP UI-Klassen, RIM ähnlich sind in dem Sinne Swing, dass UI-Operationen auf dem Event Thread auftreten, die nicht threadsicher ist, wie in MIDP. Um Code auf dem Event Thread ausführen, muss eine Anwendung eine Sperre für das Ereignis-Objekt erhalten, oder verwenden Sie invokeLater () oder invokeAndWait (.) - zusätzliche Arbeit für den Entwickler, aber Raffinesse kommt mit einem Preisschild

Aber für LCDUI , Sie können .

Andere Tipps

Es gibt viele Profile von Java ME. Wenn Sie MIDP bedeuten dann Display.runSerially ist das, was Sie wollen.

Für AWT (Swing), die Sie verwenden würden EventQueue.invokeLater (SwingUtilities.invokeLater ist nur notwendig, da Java 1.1 nicht die EventQueue Verfahren mit - 1.2 ist über seinen zehnten Geburtstag zu feiern). Für die gemeinsame DOM-API verwenden DOMService.invokeLater.

Egal, was behauptet, ein GUI-API über Thread-Sicherheit machen kann sie wahrscheinlich falsch sind (ein Teil der Ansprüche aus Swing in JDK7 entfernt, da sie nicht implementierbar ist). In jedem Fall unwahrscheinlich Anwendungscode seinen Thread-sicher.

Für J2ME-Anwendungen möchten Sie wahrscheinlich es einfach zu halten. Die Hauptsache ist UI-Komponenten nur für den Fall Thread zu berühren. Der direkte Weg, dies zu tun, ist invokeLater oder invokeAndWait . Je nach Ihren Bibliotheken haben Sie keinen Zugriff auf etwas mehr als das. Im Allgemeinen, wenn diese nicht in Ihrer Plattform vorausgesetzt, es entspricht wohl kein Support-Thread ist und kein Problem zu sein. Zum Beispiel die Brombeere es unterstützt .

Wenn Sie unter SWT entwickeln wird dies mittels asyncExec () -Methode des Anzeigeobjekts erreicht. Sie übergeben ein Objekt der Umsetzung Runnable so die UI-Thread die Änderungen in anderen Thread getan ausführt.

Dies ist ein Beispiel entlehnt hier

public void itemRemoved(final ModelEvent me)
{
   final TableViewer tableViewer = this.viewer;

   if (tableViewer != null)
   {
      display.asyncExec(new Runnable()
      {
         public void run()
         {
            tableViewer.remove(me.getItem());
         }
      }
   }
}

kann ich bestätigen, dass der MIDP-UI-Toolkit in der Tat Thread-sicher ist, wie ich auf Laufen Millionen von Handys von fast jedem Hersteller groß gemacht MIDlets mit komplexen GUI habe, und ich habe nie ein Problem in dieser Hinsicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top