| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Апплеты > Refresh страницы |
| Автор: TrivialCore 29.10.2004, 15:29 |
| Кто-нибудь может обьяснить мне поведение апплета после рефреша страницы, на которой он сидит? Или где прочитать об этом. Просто после рефреша при загрузке начальных данных он входит в бесконечную петлю, и это кончается StackOverflowError. Судя по коду, в эту петлю он не имеет шанс попасть, т.к. есть булиновская переменная специально это контролирующая. Но тут будто ее нет, или ее значение по неизвестным причинам при каждом "входе" сбрасывается на false, чего быть по идее не может, т.к. эта переменная - поле класса, который тут выражен конкретным единичным обьектом. Кто знает, помоги(те). |
| Автор: sergejzr 29.10.2004, 15:30 |
| Код в студию Без него сказать что либо трудно.. |
| Автор: TrivialCore 29.10.2004, 16:04 | ||||||
Ладно, попробуем. Все разыгрывается в 3-х классах:
В приложении есть по одному экземпляру каждого из классов. 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 | ||
|
| Автор: 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
|
| Автор: TrivialCore 29.10.2004, 16:52 | ||
| Не пойму, что значит - вовремя? У меня ведь тоже вовремя, т.к. само по себе все работает на здравие. Проблема в том, чтобы определить - почему работает иначе при рефреше страницы! Добавлено @ 16:53
|
| Автор: TrivialCore 29.10.2004, 17:53 |
| Нашел проблему, осталось ее только решить. Дело в том, что при рефреше старые обьекты не убиваются, а остаются жить! В данном случае это не касается sqlInstancesModel и sqlInstancesController (т.к. они - уникальные статичные экземпляры своего класса), зато касается sqlInstancesTabModel, который является обычным Observer, "смотрящий" на sqlInstancesModel. Так вот, после рефреша на него смотрят уже два класса типа SqlInstancesTabModel! Каждый из них при апдейте запускает sqlInstancesController - вот из-за этого и рождается бесконечная петля, и одной переменной circleStarted тут уже недостаточно. Поэтому вопрос: как при рефреше убить все живущие (хотя бы в апплете) обьекты? |
| Автор: sergejzr 29.10.2004, 17:59 | ||
Очень хорошо! это весьма ценная информация! Поищем насчёт деструкции обьектов.. |
| Автор: 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 |
| Ну слава богу |