私はVaadin 7アプリケーションを共通のレイアウトにしています。スレッドを開始するボタンがあり、何らかのコンピューティングを行います。スレッドからvaadinのコンポーネントを動的に削除して追加します。
は計算からの情報を受信して、私は、アプリケーションを起動して、計算スレッドを実行したときに表示されますが、今
などの情報を進行コンポーネントがあり、すべてが正常であると表示が正しく構築されます。そのが行われ、私はもう一度スタートボタンを押すことによって、それを再実行すると
は、私が
Exception in thread "Thread-56" java.lang.IllegalStateException: A connector should not be marked as dirty while a response is being written.
at com.vaadin.ui.ConnectorTracker.markDirty(ConnectorTracker.java:505)
at com.vaadin.server.AbstractClientConnector.markAsDirty(AbstractClientConnector.java:141)
at com.vaadin.ui.AbstractComponentContainer.removeComponent(AbstractComponentContainer.java:227)
at com.vaadin.ui.AbstractOrderedLayout.removeComponent(AbstractOrderedLayout.java:178)
at com.test.pipeline.view.ResultPanel.rebuildResultLayout(ResultPanel.java:46)
at com.test.pipeline.view.ResultUIProcessListener.startTests(ResultUIProcessListener.java:40)
at com.test.pipeline.RanorexClient$RanorexWorker$$Lambda$224/988244250.accept(Unknown Source)
at java.util.ArrayList.forEach(ArrayList.java:1249)
at com.test.pipeline.RanorexClient$RanorexWorker.inform(RanorexClient.java:99)
at com.test.pipeline.RanorexClient$RanorexWorker.run(RanorexClient.java:64)
RanorexoClient$RanorexWorker
は計算をやってThread
で入手できますか。 通知を受け取るためにワーカーに登録されたリスナーがあります。
私はチェーンフォームをUIを変更するスレッドがあります。
rebuildResultLayout
はので、新しいそれを作成し、それを再度追加し、レイアウトを削除この
void rebuildResultLayout() {
mainLayout.removeComponent(resultLayout);
resultLayout = new VerticalLayout();
mainLayout.addComponent(resultLayout);
}
のように見えます。これは以前の実行からの情報を取り除くことです - 私はまたresultLayout.removeAllComponents()
に簡単に試みましたが、これは同じエラーに終ります。
私は現在、私のinform
方法が間違っている何本
private void inform(Consumer<TestProcessListener> action) {
synchronized (UI.getCurrent()) {
processListeners.forEach(action);
}
}
のように見え、UIへの呼び出しを同期するためにどこかで読ん?例外を避けるためには何をしなければならないのですか?
カワイイ存在することが保証されなければならないことをアンドレ・シドのコメント@も参照してください - 私は答えを見つけたかもしれない:https://vaadin.com/docs/-/part/framework/advanced /advanced-push.html。 'ui.access'を使って私の問題を解決しました。誰もこの観察がただの運ではないことを確認できますか? –
はい、これが必要です。あなたのバックグラウンドスレッドに有効なUIリファレンスがあることを確認してください。分離されたスレッドを使用する場合、UI.getCurrent()は常に存在するとは限りません –