2016-08-26 3 views
1

공통 레이아웃이 있고 스레드를 시작하는 버튼이있는 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()으로 간단하게 시도했으나 동일한 오류가 발생합니다.

나는 UI에 대한 호출을 동기화 선가

, 그래서 현재 내 inform 방법은 무엇이 잘못이

private void inform(Consumer<TestProcessListener> action) { 
    synchronized (UI.getCurrent()) { 
     processListeners.forEach(action); 
    } 
} 

처럼 보인다? 예외를 피하기 위해해야 ​​할 일은 무엇입니까?

+0

아아가 존재 함을 보장해야한다는 안드레 쉴드 주석 @ 참조 - 나는 답을 찾을 수도 : https://vaadin.com/docs/-/part/framework/advanced /advanced-push.html. 'ui.access'를 사용하면 저의 문제가 해결되었습니다. 이 관찰이 지금 행운이 아니라는 것을 누군가가 확인할 수 있습니까? –

+1

네, 그게 필요합니다. 백그라운드 스레드에 유효한 UI 참조가 있는지 확인하십시오. 분리 된 스레드를 사용할 때 UI.getCurrent()가 항상 존재하지는 않습니다. –

답변

관련 문제