Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Апплеты > Refresh страницы


Автор: TrivialCore 29.10.2004, 15:29
Кто-нибудь может обьяснить мне поведение апплета после рефреша страницы, на которой он сидит? Или где прочитать об этом.
Просто после рефреша при загрузке начальных данных он входит в бесконечную петлю, и это кончается StackOverflowError. Судя по коду, в эту петлю он не имеет шанс попасть, т.к. есть булиновская переменная специально это контролирующая. Но тут будто ее нет, или ее значение по неизвестным причинам при каждом "входе" сбрасывается на false, чего быть по идее не может, т.к. эта переменная - поле класса, который тут выражен конкретным единичным обьектом.

Кто знает, помоги(те).

Автор: sergejzr 29.10.2004, 15:30
Код в студию :)
Без него сказать что либо трудно..

Автор: TrivialCore 29.10.2004, 16:04
Ладно, попробуем. Все разыгрывается в 3-х классах:



Код
public class SqlInstancesController {
  //...
   public void update(Object data[][]) {
       ArrayList instances = new ArrayList();
       for (int i=0; i<data.length; i++) {
           SqlInstancesBean bean = new SqlInstancesBean();
           bean.setBox((String)data[i][0]);
           bean.setInstance((String)data[i][1]);
           bean.setSchema((String)data[i][2]);
           bean.setHld((String)data[i][3]);
           bean.setChecked(((Boolean)data[i][4]).booleanValue());
           instances.add(bean);
       }
       sqlInstancesModel.setInstances(instances);
   }
}


Код
public class SqlInstancesModel extends Observable {
   
  //...
   public void setInstances(ArrayList instances) {
       this.instances = instances;
       setChanged();
       notifyObservers(instances);
   }
 //...
}

Код
public class SqlInstancesTabModel extends AbstractTableModel implements Observer,
       TableModelListener {

   private boolean circleStarted = false;

//...

   public void update(Observable o, Object arg) {
       if (circleStarted) {
           circleStarted = false;
       } else {
           if (arg instanceof Collection) {
               Collection instances = (Collection) arg;
               data = new Object[instances.size()][5];
               int rowCount = 0;
               Iterator i = instances.iterator();
               while (i.hasNext()) {
                   SqlInstancesBean instancesBean = (SqlInstancesBean) i.next();
                   data[rowCount][0] = instancesBean.getBox();
                   data[rowCount][1] = instancesBean.getInstance();
                   data[rowCount][2] = instancesBean.getSchema();
                   data[rowCount][3] = instancesBean.getHld();
                   data[rowCount][4] = new Boolean(instancesBean.isChecked());
                   rowCount++;
               }
               circleStarted = true;
               fireTableDataChanged();
           }
       }
   }

   public void tableChanged(TableModelEvent e) {
       sqlInstancesController.update(data);
   }

}


В приложении есть по одному экземпляру каждого из классов. SqlInstancesTabModel прикреплен к SqlInstancesModel в качестве Observer.
Все начинается с того, что нечто зовет sqlInstancesController.update(), который зовет sqlInstancesModel.setInstances(), который сигнализирует об изменениях своим Observer, что означает, что он просто зовет sqlInstancesTabModel.update(), который устанавливает circleStarted = true и зовет sqlInstancesController.update(), круг замыкается, но при следующем проходе из-за того, что circleStarted == true, круг прерывается.

А после рефреша страницы почему-то не прерывается!


Автор: DarkDS 29.10.2004, 16:11
+ трейс стак оверфлоу дать можешь?

Автор: TrivialCore 29.10.2004, 16:27
Код
java.lang.StackOverflowError

at java.awt.Toolkit.getEventQueue(Unknown Source)

at java.awt.EventQueue.isDispatchThread(Unknown Source)

at javax.swing.SwingUtilities.isEventDispatchThread(Unknown Source)

at javax.swing.JComponent.revalidate(Unknown Source)

at javax.swing.JTable.resizeAndRepaint(Unknown Source)

at javax.swing.JTable.tableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at com.hp.web.util.multitool.gui.TableSorter$TableModelHandler.tableChanged(TableSorter.java:341)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

at com.hp.web.util.multitool.controllers.SqlInstancesController.update(SqlInstancesController.java:84)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)

at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)

at javax.swing.table.AbstractTableModel.fireTableDataChanged(Unknown Source)

at com.hp.web.util.multitool.gui.SqlInstancesTabModel.update(SqlInstancesTabModel.java:137)

at java.util.Observable.notifyObservers(Unknown Source)

at com.hp.web.util.multitool.models.SqlInstancesModel.setInstances(SqlInstancesModel.java:49)

Автор: sergejzr 29.10.2004, 16:28
Решение влоб сажать circleStarted на false уже в init()

Автор: DarkDS 29.10.2004, 16:42
com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)
Это какой метод?
Добавлено @ 16:43
+ circleStarted = true; попробуй выствить сразу после else
Добавлено @ 16:46
Цитата(sergej @ 29.10.2004, 16:28)

Решение влоб сажать circleStarted на false уже в init()

:) Циклится не изза false. Там нужно во время в true выставить :)

Автор: TrivialCore 29.10.2004, 16:52
Не пойму, что значит - вовремя? У меня ведь тоже вовремя, т.к. само по себе все работает на здравие. Проблема в том, чтобы определить - почему работает иначе при рефреше страницы!
Добавлено @ 16:53
Цитата(DarkDS @ 29.10.2004, 16:42)

com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)
Это какой метод?
Это метод tableChanged() =)

Автор: TrivialCore 29.10.2004, 17:53
Нашел проблему, осталось ее только решить. Дело в том, что при рефреше старые обьекты не убиваются, а остаются жить! В данном случае это не касается sqlInstancesModel и sqlInstancesController (т.к. они - уникальные статичные экземпляры своего класса), зато касается sqlInstancesTabModel, который является обычным Observer, "смотрящий" на sqlInstancesModel.
Так вот, после рефреша на него смотрят уже два класса типа SqlInstancesTabModel! Каждый из них при апдейте запускает sqlInstancesController - вот из-за этого и рождается бесконечная петля, и одной переменной circleStarted тут уже недостаточно.

Поэтому вопрос: как при рефреше убить все живущие (хотя бы в апплете) обьекты?

Автор: sergejzr 29.10.2004, 17:59
Цитата(TrivialCore @ 29.10.2004, 16:53)

Дело в том, что при рефреше старые обьекты не убиваются, а остаются жить!


Очень хорошо! это весьма ценная информация!
Поищем насчёт деструкции обьектов..



Автор: TrivialCore 29.10.2004, 18:04
Дело в том, что при таком рестарте апплета машина явы остается та же, без перезагрузки. Поэтому статичные экземпляры классов остаются такими, какими мы их оставили. Так как к некоторым из этих экземпляров прикреплены Observer, то и эти Observer остаются жить.

Можно отслеживать всех "смотрящих" и их убивать, но у меня их довольно много, поэтому хотелось бы какое-нибудь реальное weapon of mass destruction =)

Например убить машину и возродить заново.

Но как?

Автор: sergejzr 29.10.2004, 18:11
попробуй в функциях:
stop + destroy + init + start
Выдавать сообщения, чтобы увидеть в каком порядке они вызывайытся при рефреше. Возможно не вызывается destroy()..

Автор: TrivialCore 29.10.2004, 18:21
Во, именно это было нужно. В destroy() можно компактно поуничтожать все статичные обьекты. А вместе с ними умрут и все Observer, сборщик мусора их вытрет.
Спасибо =)

Автор: sergejzr 29.10.2004, 18:26
Ну слава богу :) А то какие-то странности были :)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)