![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| TrivialCore |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 242 Регистрация: 26.4.2004 Репутация: 1 Всего: 5 |
Кто-нибудь может обьяснить мне поведение апплета после рефреша страницы, на которой он сидит? Или где прочитать об этом.
Просто после рефреша при загрузке начальных данных он входит в бесконечную петлю, и это кончается StackOverflowError. Судя по коду, в эту петлю он не имеет шанс попасть, т.к. есть булиновская переменная специально это контролирующая. Но тут будто ее нет, или ее значение по неизвестным причинам при каждом "входе" сбрасывается на false, чего быть по идее не может, т.к. эта переменная - поле класса, который тут выражен конкретным единичным обьектом. Кто знает, помоги(те). |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
Код в студию
Без него сказать что либо трудно.. |
|||
|
||||
| TrivialCore |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 242 Регистрация: 26.4.2004 Репутация: 1 Всего: 5 |
Ладно, попробуем. Все разыгрывается в 3-х классах:
В приложении есть по одному экземпляру каждого из классов. SqlInstancesTabModel прикреплен к SqlInstancesModel в качестве Observer. Все начинается с того, что нечто зовет sqlInstancesController.update(), который зовет sqlInstancesModel.setInstances(), который сигнализирует об изменениях своим Observer, что означает, что он просто зовет sqlInstancesTabModel.update(), который устанавливает circleStarted = true и зовет sqlInstancesController.update(), круг замыкается, но при следующем проходе из-за того, что circleStarted == true, круг прерывается. А после рефреша страницы почему-то не прерывается! |
||||||
|
|||||||
| DarkDS |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 748 Регистрация: 6.5.2003 Где: Таллинн, Эстония Репутация: нет Всего: 16 |
+ трейс стак оверфлоу дать можешь?
|
|||
|
||||
| TrivialCore |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 242 Регистрация: 26.4.2004 Репутация: 1 Всего: 5 |
|
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
Решение влоб сажать circleStarted на false уже в init()
|
|||
|
||||
| DarkDS |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 748 Регистрация: 6.5.2003 Где: Таллинн, Эстония Репутация: нет Всего: 16 |
com.hp.web.util.multitool.gui.SqlInstancesTabModel.tableChanged(SqlInstancesTabModel.java:143)
Это какой метод? Добавлено @ 16:43 + circleStarted = true; попробуй выствить сразу после else Добавлено @ 16:46
|
|||
|
||||
| TrivialCore |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 242 Регистрация: 26.4.2004 Репутация: 1 Всего: 5 |
Не пойму, что значит - вовремя? У меня ведь тоже вовремя, т.к. само по себе все работает на здравие. Проблема в том, чтобы определить - почему работает иначе при рефреше страницы!
Добавлено @ 16:53
|
|||
|
||||
| TrivialCore |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 242 Регистрация: 26.4.2004 Репутация: 1 Всего: 5 |
Нашел проблему, осталось ее только решить. Дело в том, что при рефреше старые обьекты не убиваются, а остаются жить! В данном случае это не касается sqlInstancesModel и sqlInstancesController (т.к. они - уникальные статичные экземпляры своего класса), зато касается sqlInstancesTabModel, который является обычным Observer, "смотрящий" на sqlInstancesModel.
Так вот, после рефреша на него смотрят уже два класса типа SqlInstancesTabModel! Каждый из них при апдейте запускает sqlInstancesController - вот из-за этого и рождается бесконечная петля, и одной переменной circleStarted тут уже недостаточно. Поэтому вопрос: как при рефреше убить все живущие (хотя бы в апплете) обьекты? Это сообщение отредактировал(а) TrivialCore - 29.10.2004, 17:53 |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
Очень хорошо! это весьма ценная информация! Поищем насчёт деструкции обьектов.. |
|||
|
||||
| TrivialCore |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 242 Регистрация: 26.4.2004 Репутация: 1 Всего: 5 |
Дело в том, что при таком рестарте апплета машина явы остается та же, без перезагрузки. Поэтому статичные экземпляры классов остаются такими, какими мы их оставили. Так как к некоторым из этих экземпляров прикреплены Observer, то и эти Observer остаются жить.
Можно отслеживать всех "смотрящих" и их убивать, но у меня их довольно много, поэтому хотелось бы какое-нибудь реальное weapon of mass destruction =) Например убить машину и возродить заново. Но как? |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
попробуй в функциях:
stop + destroy + init + start Выдавать сообщения, чтобы увидеть в каком порядке они вызывайытся при рефреше. Возможно не вызывается destroy().. |
|||
|
||||
| TrivialCore |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 242 Регистрация: 26.4.2004 Репутация: 1 Всего: 5 |
Во, именно это было нужно. В destroy() можно компактно поуничтожать все статичные обьекты. А вместе с ними умрут и все Observer, сборщик мусора их вытрет.
Спасибо =) |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
Ну слава богу
|
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Апплеты | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |