7

UI インタラクションを管理する 3 つの方法の違いを理解しようとしています。

実際のケースでそれらを理解しようとするとき、私はこれらの3つの用語と本当に混乱しています.

以下のコードは、invokeAndWait メソッドの機能を示していますが、invokeLater または getEventLock() に置き換えると、プログラムはまったく同じように動作します。

UI を更新するための 3 つの方法の違いを示すために、コードを修正していただけませんか?

public final class HelloWorldMainScreen extends MainScreen
{
    private LabelField labelField;
    public HelloWorldMainScreen()
    {        
        labelField = new LabelField("Hello World");       
        add(labelField);
        MainScreenUpdaterThread thread = new MainScreenUpdaterThread(this);
        thread.start();
    }

    public void appendLabelText(String text){
        labelField.setText(labelField.getText()+"\n"+text);
    }
}

public class MainScreenUpdaterThread extends Thread {
    HelloWorldMainScreen mainScreen;

    public MainScreenUpdaterThread(HelloWorldMainScreen mainScreen){
        this.mainScreen = mainScreen;
    }

    public void run(){
        for (int i = 0; i < 10; i++) {
            try{
                Thread.sleep(5000);
            }catch(InterruptedException ex){};
            UiApplication.getUiApplication().invokeAndWait(new Runnable() {

                public void run() {
                    mainScreen.appendLabelText("Update");                   
                }
            });
        }
    }
}

これらの 3 つの概念は、多くの初心者にとって非常に紛らわしいので、それらの機能を説明する説明的なソース コードは誰にとっても非常に役立つと思います。

前もって感謝します!

4

2 に答える 2

6

3つの異なるアプローチに対する私の理解:

  • Application.getEventLock()- できるだけ早くイベント ロックを取得します
  • UiApplication.invokeLater()-Runnableイベントキューに入れると、このキューに入れられた他のすべてのタスクの後に実行されます
  • UiApplication.invokeAndWait()Runnable- 呼び出しスレッドが実行されるまで停止されることを除いて、前のものと同じ

私の個人的な意見では、最初の方法は決して使用しません。私の描画または UI 変更タスクのいずれかが、他のタスクが既にイベント キューに入れているよりも優先されているとは思いません。

私は主に2番目の方法を使用し、モーダルポップアップダイアログの選択を実装したときに最後の方法を1回使用しました。

于 2012-12-24T20:30:04.653 に答える
2

getEventLock() : アプリケーション ユーザー インターフェイスのイベント ロックを取得します。ワーカー スレッドは、イベント スレッドでシリアル化されたコードを実行する場合、このスレッドで同期する必要があります。このアクションはスレッド ディスパッチャーを一時停止するため、ワーカー スレッドは短時間だけロックを保持する必要があります。

デバイスのユーザー インターフェイスに関連するすべての操作は、ロックを保持した状態で行う必要があります。UI システムは、呼び出すすべてのメソッドが、既にロックされているスレッドで実行されることも保証します。

アプリケーションは、このオブジェクトに対して通知または待機を呼び出してはなりません。

invokeLater() : 実行可能なオブジェクトをこのアプリケーションのイベント キューに入れます。実行可能なオブジェクトを渡してこのメ​​ソッドを呼び出し、保留中のすべてのイベントが処理された後に、ディスパッチ スレッドでそのオブジェクトの run() メソッドを呼び出します。

イベント ディスパッチ スレッドがない場合 (つまり、hasEventThread() が false を返す)、キューがサイズ制限を超えると、キューに入れられる最後のアイテムが削除されます。注: アプリケーションにイベント スレッドがない場合は、 setAcceptEvents(boolean) を呼び出して、アプリケーションがイベントを受け入れなくなったことをランタイム システムに通知できます。その後、そのアプリケーションのキューに入れられたすべてのイベントが破棄されます。

invokeAndWait() : 実行可能なオブジェクトをこのアプリケーションのイベント キューに入れ、処理されるまで待機します。実行可能なオブジェクトを渡してこのメ​​ソッドを呼び出し、保留中のすべてのイベントが処理された後に、ディスパッチ スレッドでそのオブジェクトの run() メソッドを呼び出します。

このメソッドは、挿入イベントが処理されるまで (つまり、実行可能なオブジェクトの run() メソッドが戻るまで) ブロックします。

このメソッドは、イベント ディスパッチ スレッドで安全に呼び出すことができます。この場合、ランナブルはすぐに実行されます。

イベント ディスパッチ スレッドがない場合 (つまり、hasEventThread() が false を返す)、キューがサイズ制限を超えると、キューに入れられる最後のアイテムが削除されます。注: アプリケーションにイベント スレッドがない場合は、 setAcceptEvents(boolean) を呼び出して、アプリケーションがイベントを受け入れなくなったことをランタイム システムに通知できます。その後、そのアプリケーションのキューに入れられたすべてのイベントが破棄されます。

API ドキュメント: http://www.blackberry.com/developers/docs/4.3.0api/net/rim/device/api/system/Application.html#invokeLater(java.lang.Runnable )

于 2012-12-26T17:49:40.553 に答える