공통 레이아웃이 있고 스레드를 시작하는 버튼이있는 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를 변경하는 사슬 양식이 있습니다. 이
void rebuildResultLayout() {
mainLayout.removeComponent(resultLayout);
resultLayout = new VerticalLayout();
mainLayout.addComponent(resultLayout);
}
이 때문에 새로운 생성하고 다시 추가 레이아웃을 제거 같은
rebuildResultLayout
보인다. 이것은 이전 실행에서 정보를 제거하는 것입니다 - 나는 또한 resultLayout.removeAllComponents()
으로 간단하게 시도했으나 동일한 오류가 발생합니다.
, 그래서 현재 내 inform
방법은 무엇이 잘못이
private void inform(Consumer<TestProcessListener> action) {
synchronized (UI.getCurrent()) {
processListeners.forEach(action);
}
}
처럼 보인다? 예외를 피하기 위해해야 할 일은 무엇입니까?
아아가 존재 함을 보장해야한다는 안드레 쉴드 주석 @ 참조 - 나는 답을 찾을 수도 : https://vaadin.com/docs/-/part/framework/advanced /advanced-push.html. 'ui.access'를 사용하면 저의 문제가 해결되었습니다. 이 관찰이 지금 행운이 아니라는 것을 누군가가 확인할 수 있습니까? –
네, 그게 필요합니다. 백그라운드 스레드에 유효한 UI 참조가 있는지 확인하십시오. 분리 된 스레드를 사용할 때 UI.getCurrent()가 항상 존재하지는 않습니다. –