0

私の Java アプリケーションのメイン クラスには、main() が呼び出される前に、OS からの通知をリッスンするように ApplicationAdapter を設定する静的イニシャライザがあります。これまでのところ、これは期待どおりに機能しています。ただし、最近 (10.7 以降? タイムラインについては不明)、これが機能しないことがあります。アプリをデバッグした後、静的イニシャライザーがまだ実行されている間に、OS がファイル オープン イベントをイベント スレッドに非同期的に投稿しているように見えます。そのため、ファイルを開くイベントがポストされる前に初期化が完了する (そしてファイルが正しく開かれる) 場合もあれば、初期化が完了する前に (つまり、アプリが ApplicationListener を登録する前に) イベントがポストされる場合もあるため、アプリは決してイベントを処理する機会を得て、要求されたドキュメントは開かれません。

他の誰かがこの問題に遭遇しましたか?

私が試した解決策の 1 つは、次のようなメイン クラスの静的イニシャライザの先頭でイベント キューを一時停止することです。

static{
    final Object monitor = new Object();
    SwingUtilities.invokeLater( new Runnable(){
       public void run(){
            synchronized( monitor) {
                try{ monitor.wait(); } catch( Exception e ){ e.printStackTrace(); }
            }
       }
    });

    registerApplicationListener();

    synchronized( monitor) {
        try{ monitor.notifyAll(); }
        catch(Exception e){ e.printStackTrace(); }
    }
}

これにより、アプリケーションの初期化で ApplicationListener が OS イベントを受信するように設定されている間、イベントのディスパッチがブロックされます。ただし、初期化が完了する前に OS がイベントをディスパッチする可能性があるという問題が残っており、私が知る限り、それについてできることは何もありません。Apple Java 拡張機能 API には、イベント ディスパッチの動作を制御する方法を示すものは何もありません。また、Info.plist の構成を介してイベント ディスパッチの側面を制御する方法を見つけることもできませんでした。

4

1 に答える 1

0

これが OS X シェルからのファイル オープン イベントであることを確認しました。Java アプリケーションはこの通知を確実にキャッチできません。回避策として、起動デーモンをインストールして通知をキャッチし、起動パラメーターとしてアプリケーションに転送します。

アプリの URL スキームを登録することも機能する可能性がありますが、Java アプリで試したことはありません。params が main() args に来ることを願っています。

于 2012-09-17T17:19:16.003 に答える