Ошибка при последующем добавлении данных в CellTable секунду в GWT/GWT Platform
Я использую всплывающую панель платформы GWT, и всплывающее окно содержит две панели на верхней панели, у меня есть несколько текстовых полей и кнопка поиска.
и на второй панели содержится таблица ячеек, которая автоматически загружает некоторые данные из базы данных, как только всплывающее окно появляется. и с верхней панели также я должен иметь возможность искать конкретные данные и обновлять таблицу ячеек. я использую следующий код для обновления CellTable
public void update(List<UserData> data){
dataProvider.getList().clear();
List<UserData> dataList=dataProvider.getList();
for (UserData rtaData : data) {
dataList.add(rtaData);
}
dataProvider.addDataDisplay(cellTable);
}
мой код работает нормально, но когда я вижу окно режима разработки gwt в затмении, я вижу следующую ошибку, когда я нажимаю кнопку поиска.
14:46:25.796 [ERROR] [gwtemotor] Uncaught exception escaped
java.lang.IllegalStateException: The specified display has already been added to this adapter.
at com.google.gwt.view.client.AbstractDataProvider.addDataDisplay(AbstractDataProvider.java:83)
at com.bagi.emotor.client.ui.presenter.RTOLocationView.update(RTOLocationView.java:230)
at com.bagi.emotor.client.ui.presenter.RTOLocationPresenter$2.onSuccess(RTOLocationPresenter.java:85)
at com.bagi.emotor.client.ui.presenter.RTOLocationPresenter$2.onSuccess(RTOLocationPresenter.java:1)
at com.gwtplatform.dispatch.client.DefaultDispatchAsync.onExecuteSuccess(DefaultDispatchAsync.java:229)
at com.gwtplatform.dispatch.client.DefaultDispatchAsync$2.onSuccess(DefaultDispatchAsync.java:137)
at com.gwtplatform.dispatch.client.DefaultDispatchAsync$2.onSuccess(DefaultDispatchAsync.java:1)
at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:232)
at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:287)
at com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:395)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:337)
at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:218)
at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:561)
at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:269)
at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:213)
at sun.reflect.GeneratedMethodAccessor34.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:292)
at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:546)
at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:363)
at java.lang.Thread.run(Unknown Source)
хотя приложение работает, мне нужно понять, почему эта ошибка появляется,
Спасибо,
2 ответа
Вы вызываете dataProvider.addDataDisplay(cellTable);
на каждом вызове update(List<UserData> data)
, addDataDisplay необходимо вызывать только один раз для каждого просмотра.
Если у вас есть несколько просмотров, способ MVP является
View 1 -> cellTable
View 2 -> cellTree
Presenter -> dataProvider
dataProvider.addDataDisplay(cellTable)
dataProvider.addDataDisplay(cellTree)
Решение
Переехать dataProvider.addDataDisplay
в ваш конструктор или ленивый инициализировать его в update(List<UserData> data);
boolean initialized = false;
public void update(List<UserData> data){
dataProvider.getList().clear();
if(!initialized) {
dataProvider.addDataDisplay(cellTable);
initialized = true;
}
List<UserData> dataList=dataProvider.getList();
for (UserData rtaData : data) {
dataList.add(rtaData);
}
}
Заявление dataProvider.addDataDisplay(cellTable)
добавляет отображение данных для этого адаптера. Текущий диапазон интереса дисплея будет заполнен данными.
Если отображение данных уже добавлено, и вы попытаетесь добавить это снова, оно выдаст эту ошибку.
Чтобы избежать этой ошибки, вы можете проверить состояние и удалить добавленное отображение перед добавлением того же отображения данных. то есть:
if (getProvider().getDataDisplays().contains(cellTable)) {
getProvider().removeDataDisplay(cellTable);
}
getProvider().addDataDisplay(cellTable);