これは非常に一般的な問題ですが、E4では実際のサポートがないようです(ただし、正しく覚えていればE3でも動作しませんでした)。アプリケーション実行時にコードを実行閉じる
アプリケーションが終了したときにデータベース接続を終了します。またはより一般的には、私は退去時に何らかのクリーンアップをしたい。
ので、このための通常のAPIは次のとおりです。
public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
public ApplicationWorkbenchWindowAdvisor(final IWorkbenchWindowConfigurer configurer) {
super(configurer);
}
@Override
public boolean preWindowShellClose() {
if (PlatformUI.getWorkbench().getWorkbenchWindowCount() <= 1) {
// the last window is about to close
Datababase.close();
}
return super.preWindowShellClose();
}
}
問題?アプリケーションが終了するたびに、特にPlatformUI.getWorkbench().close();
には呼び出されません(JavaDocがこのメソッドでウィンドウを閉じると主張しても)。
(あなたはこの主張が正しいかどうかをテストしたい場合は、ちょうどあなたのアプリケーションを閉じるようにExitHandler
を使用して - 。preWindowShellClose()
はその後、呼び出されません)
私は自分のハンドラを作成し、手動でクリーンアップ呼び出すことができます方法はもう一度、私はより良い方法があることを望んでいた。
あなたがアプリケーションのシャットダウンに反応できるもう一つの方法は、Shutdown Hooks API次のとおりです。
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
Datababase.close();
}));
問題:RCPアプリケーションのために、このフックが道と呼ばれ、途中、あまりにも遅く、例えばすべてのプラグインはすでに閉じています。
私は単純な(そして働く)方法が必要であると感じ、私はそれをまだ見つけていません。重要な場合は、Lesser Evil Eclipse(別名E3互換)を使用しています。
アプリケーションが終了するたびにコードを実行するにはどうすればよいですか?
'IWorkbench :: addWindowListener'または' IWorkbench :: addWorkbenchListener'を試しましたか?これらが確実に機能しない場合は、バンドルの 'stop'メソッドからクリーンアップコードを実行することを検討することができます。申し訳ありませんが、私はここでしか推測できません... –
@RüdigerHerrmannいいえ、私はこれらを試していません。そして、両方がうまくいくようです。だから私はそれが答えだと思う。 –