5

J2ME アプリケーションを作成しています。そのうちの 1 つは、ディレクトリの内容を定期的にポーリングし、新しいものがあれば画面に表示するものです。これは、UI フォームがそれ自体へのポインターを使用してポーリング スレッドを起動し、ポーリング スレッドが何かを見つけたときにフォームにコールバックし、同期されたメソッドを呼び出して表示を更新することで実現しました。これはうまくいくようです。

私が持っている質問はこれです。C#/.NET では、非 UI スレッドで UI を更新するのは良くないことを知っています。これを処理する正しい方法は、UI スレッドに委譲することです。

たとえば、次のとおりです。

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

このプロセスを管理する方法に相当する J2ME はありますか? Javaはどうですか?それとも、Java/J2ME のほうがこれに関してうまくいくのでしょうか? そうでない場合、これはどのように行われますか?

[編集] Swing は、SwingUtilities.invokeLater() および invokeAndWait() メソッドを介して私が求めていることをサポートしているようです。J2ME に相当するフレームワークはありますか?

4

5 に答える 5

5

Javaに関しては、あなたが説明しているものはSwingWorker (ワーカースレッド)のように見えます。

Swing プログラムが実行時間の長いタスクを実行する必要がある場合、通常はバックグラウンド スレッドとも呼ばれるワーカー スレッドの 1 つを使用します。

Swing プログラムには、次の種類のスレッドが含まれます。

  • 初期スレッド、初期アプリケーション コードを実行するスレッド。
  • すべてのイベント処理コードが実行されるイベント ディスパッチ スレッド。Swing フレームワークとやり取りするほとんどのコードも、このスレッドで実行する必要があります。
  • バックグラウンド スレッドとも呼ばれるワーカー スレッド。時間のかかるバックグラウンド タスクが実行されます。

シングル スレッド ルール:
Swing コンポーネントが認識されると、そのコンポーネントの状態に影響を与えたり依存したりする可能性のあるすべてのコードは、イベント ディスパッチ スレッドで実行する必要があります。

J2EE コンテキストで使用する場合、EJB から SwingWorker を参照するときは注意が必要です。

J2MEに関しては、MIDP 対応デバイスで実行される標準の MIDlet としてアプリケーションを開発しているか、またはたとえばRIMlet (BlackBerry 固有の API を使用するため BlackBerry でのみ実行される CLDC ベースのアプリケーション)として開発しているかによって異なります。デバイス。

MIDP の UI クラスとは異なり、MIDP のようにスレッドセーフではないイベント スレッドで UI 操作が発生するという意味で、RIM は Swing に似ているためです。イベント スレッドでコードを実行するには、アプリケーションでイベント オブジェクトのロックを取得するか、invokeLater() または invokeAndWait() を使用する必要があります。これは開発者にとって余分な作業ですが、高度化にはコストがかかります。

ただし、LCDUIの場合は、複数のスレッドからフォームにアクセスできます。

于 2008-11-15T14:26:31.790 に答える
4

Java ME には多くのプロファイルがあります。あなたがMIDPを意味するなら、Display.runSeriallyあなたが望むものです。

AWT (Swing) の場合、EventQueue.invokeLater(SwingUtilities.invokeLaterは Java 1.1 にメソッドがないためにのみ必要ですEventQueue。1.2 は 10 周年を迎えようとしています)。共通 DOM API の場合は、 を使用しますDOMService.invokeLater

GUI API がスレッドセーフについてどのような主張をしていても、おそらく間違っています (Swing の主張の一部は、実装できないため JDK7 で削除されています)。いずれにせよ、アプリケーション コードがスレッド セーフである可能性は低いです。

于 2008-11-15T17:54:25.630 に答える
1

j2me アプリケーションの場合、おそらくシンプルに保ちたいと思うでしょう。主なことは、イベント スレッドでのみ UI コンポーネントに触れることです。これを行う直接的な方法は、invokeLater または invokeAndWaitを使用することです。ライブラリによっては、それ以上のものにはアクセスできません。一般に、これらがプラットフォームで提供されていない場合は、おそらくスレッドのサポートがなく、問題にならないことと同じです。たとえば、ブラックベリーはそれをサポートしています。

于 2008-11-15T15:04:26.907 に答える
1

SWT で開発する場合、これは Display オブジェクトの asyncExec() メソッドによって実現されます。UI スレッドが他のスレッドで行われた変更を実行するように、Runnable を実装するオブジェクトを渡します。

こちらからお借りした作例です

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());
         }
      }
   }
}
于 2008-11-15T15:16:05.683 に答える
1

MIDP UI ツールキットが実際にスレッドセーフであることを証明できます。ほとんどすべてのメーカーが製造した何百万もの電話で複雑な GUI を備えた大規模な MIDlet を実行していますが、その点で問題は見たことがありません。

于 2010-04-23T16:05:30.387 に答える