Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > Flex

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 01.12.2009, 16:55
erectus вне форума Посмотреть профиль Отправить личное сообщение для erectus Найти все сообщения от erectus
  № 1  
Ответить с цитированием
erectus

Регистрация: Dec 2009
Сообщений: 25
Question старнный эксепшен при использовании CustomItemRenderer

Подскажите где искать проблему, уже всё перерыл....
Структура приложения следующая. Есть основная swf-ка, содержашая основные классы и минимум ресурсов (чтобы грузилась быстрей). В нее динамически через несколько SWFLoader-ов подгружаются отдельные модули. Один из таких модулей - магазин. Основная его часть - это два флексовских контрола: List - список товаров, и TileList - инвентарь пользователя. Для обоих списков созданы свои ItemRenderer-ы: для товара он содержит картинку, описание товара и цену, плюс кнопку "купить", при нажатии на которую на сервер отправляется соотвсетствующая команда. В ответ сервер присылает список элементов инвентаря с учетом купленной вещи. Этот ответ принимается главной swf-кой, которая генерит евент. Модуль "магазин" ловит этот эвент и обновляет инвентарь (создается новый ArrayCollection, заполняется данными и заменяется dataProvider).
похоже, что примерно в этот момент вываливается следующее исключение:
Код:
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
	at mx.utils::LoaderUtil$/normalizeURL()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\utils\LoaderUtil.as:93]
	at mx.controls::SWFLoader/loadContent()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\controls\SWFLoader.as:1626]
	at mx.controls::SWFLoader/load()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\controls\SWFLoader.as:1447]
	at mx.controls::SWFLoader/commitProperties()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\controls\SWFLoader.as:1229]
	at mx.core::UIComponent/validateProperties()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\core\UIComponent.as:5807]
	at mx.managers::LayoutManager/validateClient()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\managers\LayoutManager.as:811]
	at mx.controls.listClasses::TileBase/getPreparedItemRenderer()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\controls\listClasses\TileBase.as:585]
	at mx.controls.listClasses::TileBase/makeRowsAndColumns()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\controls\listClasses\TileBase.as:409]
	at mx.controls.listClasses::ListBase/makeRowsAndColumnsWithExtraRows()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\controls\listClasses\ListBase.as:1380]
	at mx.controls.listClasses::ListBase/updateDisplayList()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\controls\listClasses\ListBase.as:3726]
	at mx.controls.listClasses::TileBase/updateDisplayList()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\controls\listClasses\TileBase.as:2357]
	at mx.controls.listClasses::ListBase/validateDisplayList()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\controls\listClasses\ListBase.as:3348]
	at mx.managers::LayoutManager/validateDisplayList()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\managers\LayoutManager.as:622]
	at mx.managers::LayoutManager/doPhasedInstantiation()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\managers\LayoutManager.as:695]
	at Function/http://adobe.com/AS3/2006/builtin::apply()
	at mx.core::UIComponent/callLaterDispatcher2()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\core\UIComponent.as:8733]
	at mx.core::UIComponent/callLaterDispatcher()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\core\UIComponent.as:8673]
Все, что нашел в гугле, это совет инициализировать переменные:
Цитата:
when defining my private variables, instead of writing:
private var textfield:TextField;

I had to write
private var textfield:TextField = new TextField();
но где искать, если эксепшен вываливается в mx.utils::LoaderUtil.normalizeURL()?

Старый 01.12.2009, 17:03
Elfenit вне форума Посмотреть профиль Отправить личное сообщение для Elfenit Найти все сообщения от Elfenit
  № 2  
Ответить с цитированием
Elfenit

Регистрация: Dec 2009
Адрес: Москва
Сообщений: 16
Запостите хотябы текст виноватого по вашему мнению рендерера. Эксепшн где-то в нутрях валится, поэтому если виноват именно рендерер, значит он неправильно написан =)
Да и вообще, вы уверены в виновности рендерера? Зачем рендереру нужен вдруг метод normalizeURL()?


Последний раз редактировалось Elfenit; 01.12.2009 в 17:06. Причина: добавления
Старый 01.12.2009, 18:33
erectus вне форума Посмотреть профиль Отправить личное сообщение для erectus Найти все сообщения от erectus
  № 3  
Ответить с цитированием
erectus

Регистрация: Dec 2009
Сообщений: 25
Цитата:
Зачем рендереру нужен вдруг метод normalizeURL()?
я думаю, URL - адрес файла с изображением...

код рендерера, пожалуйста:
Код:
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas
	xmlns:mx="http://www.adobe.com/2006/mxml"
	horizontalScrollPolicy="off" verticalScrollPolicy="off"
	backgroundImage="assets/inventory/cell.png"
	initialize="init()"
	mouseOver="showButtons()"
	mouseOut="hideButtons()"
	
	toolTip="_"
	toolTipCreate="createToolTip(event)"
>
	
	<mx:Image id="mImage" source="{mImageSource}" />
	
	<mx:Button id="btnUse"
		x="0"
		y="0"
		width="{BUTTON_SIZE}"
		height="{BUTTON_SIZE}"
		icon="@Embed(source='../../../../../resources/btn_useitem.png')"
		toolTip="{resourceManager.getString('strings', 'BTN_USE')}"
		click="onBtnUseClick()"
	/>
	
	<mx:Button
		id="btnSell"
		x="{BUTTON_SIZE + BUTTON_GAP}"
		y="0"
		width="{BUTTON_SIZE}"
		height="{BUTTON_SIZE}"
		icon="@Embed(source='../../../../../resources/btn_sellitem.png')"
		toolTip="{resourceManager.getString('strings', 'BTN_SELL')}"
		click="onBtnSellClick()"
	/>
	
	<mx:TextArea id="lbAmount"
		x="0"
		y="{this.height - BUTTON_SIZE}"
		width="{BUTTON_SIZE}"
		height="{BUTTON_SIZE}"
		text="{mAmount}"
		selectable="false"
		backgroundColor="#AAAAAA"
		backgroundAlpha="0.7"
		fontWeight="bold"
		color="#0000FF"
	/>
	
    <mx:Script>
        <![CDATA[
			
			import MiniIT.projects.petwar.net.IModuledServer;
			import MiniIT.projects.petwar.ui.CustomToolTip;
			import mx.events.ToolTipEvent;

			private const BUTTON_SIZE : int = 20;
			private const BUTTON_GAP : int = 3;  // расстояние между кнопками
			
			private var mShowUseButton    : Boolean = false;
			private var mShowSellButton   : Boolean = false;
			
			[Bindable]
			private var mImageSource : * ;
			
			[Bindable]
			private var mAmount : String;
			
			private function init():void
            {
				mouseChildren = true;
				hideButtons();
            }
            
			override public function set data( value:Object ):void
            {
				super.data = value;
				trace("-- inventory ir set data --", data.type, data.image);
				switch(data.type)
				{
					case "clothing":
					case "food":
					case "toy":
					case "property":
					case "spystuff":
						mShowUseButton = true;
						mShowSellButton = (data.price > 0);
						break;
						
					default:
						mShowUseButton = false;
						mShowSellButton = false;
						toolTip = "";
						break;
				}
				
				if (data && data.id >= 0 && data.id != int.MAX_VALUE)
				{
					if(data.image)
						mImageSource = data.image;
					if (data.amount)
						mAmount = data.amount.toString();
				}
				else
				{
					mImageSource = "/assets/inventory/empty.png";
					mAmount = "";
				}
            }
			
			private function showButtons():void
			{
				btnUse.visible   = mShowUseButton;
				btnSell.visible  = mShowSellButton;
			}
			
			private function hideButtons():void
			{
				btnUse.visible   = false;
				btnSell.visible  = false;
			}
			
			private function createToolTip(event:ToolTipEvent) : void
			{
				if (data && data.name)
				{
					var tip : InventoryToolTip = new InventoryToolTip();
					tip.data = data;
					event.toolTip = tip;
				}
			}
			
			private function onBtnUseClick():void
			{
				Global.server.activateItem(data.id);
			}
			
			private function onBtnSellClick():void
			{
				Global.server.shop.sell(data.id);
			}
            
        ]]>
    </mx:Script>
</mx:Canvas>

Старый 01.12.2009, 18:49
Elfenit вне форума Посмотреть профиль Отправить личное сообщение для Elfenit Найти все сообщения от Elfenit
  № 4  
Ответить с цитированием
Elfenit

Регистрация: Dec 2009
Адрес: Москва
Сообщений: 16
в set data самой первой строчкой припишите
if (!data) return;
Или вставьте везде проверки на не налл дату. А то вот такая проверка if (data && data.id >= 0 && data.id != int.MAX_VALUE) выглядит довольно глупо после уже неоднократного обращения к полям data.
Дальше посмотрим.

Кстати, не увидел в коде нормалайза никакого.
Плюс, какую SDK вы используете для сборки? В 3.4 в этой LoaderUtil.as:93 строке не содержится опасных операций + 3.4 не выдает ошибок на русском, как я знаю.


Последний раз редактировалось Elfenit; 01.12.2009 в 18:52.
Старый 01.12.2009, 19:14
erectus вне форума Посмотреть профиль Отправить личное сообщение для erectus Найти все сообщения от erectus
  № 5  
Ответить с цитированием
erectus

Регистрация: Dec 2009
Сообщений: 25
Цитата:
Кстати, не увидел в коде нормалайза никакого.
ну так в этом и вопрос: где искать проблему

Цитата:
какую SDK вы используете для сборки?
3.4.1.10084

Цитата:
3.4 не выдает ошибок на русском, как я знаю
насколько я понимаю, русский текст выдает не SDK, а плеер, в зависимости от системных насроек... хотя я могу и ошибаться

Старый 01.12.2009, 19:17
Elfenit вне форума Посмотреть профиль Отправить личное сообщение для Elfenit Найти все сообщения от Elfenit
  № 6  
Ответить с цитированием
Elfenit

Регистрация: Dec 2009
Адрес: Москва
Сообщений: 16
Ну ок. Так что-то изменилось после такого изменения кода?

Старый 01.12.2009, 20:31
erectus вне форума Посмотреть профиль Отправить личное сообщение для erectus Найти все сообщения от erectus
  № 7  
Ответить с цитированием
erectus

Регистрация: Dec 2009
Сообщений: 25
нет, ничего не изменилось

Старый 01.12.2009, 21:02
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 8  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
>> какую SDK вы используете для сборки?
3.4.1.10084

Чего-то не срастается... ... autobuild\3.4.0\frameworks...
Да и скорее всего что-то с настройками загрузки RSL - в ваших модулях, скорее всего что етот рендерер тут ни при чем.
__________________
Hell is the possibility of sanity

Старый 01.12.2009, 21:12
Elfenit вне форума Посмотреть профиль Отправить личное сообщение для Elfenit Найти все сообщения от Elfenit
  № 9  
Ответить с цитированием
Elfenit

Регистрация: Dec 2009
Адрес: Москва
Сообщений: 16
<mx:Image id="mImage" source="{mImageSource}" />
По-моему, так нельзя. http://www.adobe.com/livedocs/flex/3...ols/Image.html

Больше существенных нареканий к этому коду кроме архитектуры у меня нет. Если исправление или временное отключение этого участка не поможет, я бы стал искать проблему где-то вокруг.

Старый 01.12.2009, 22:33
erectus вне форума Посмотреть профиль Отправить личное сообщение для erectus Найти все сообщения от erectus
  № 10  
Ответить с цитированием
erectus

Регистрация: Dec 2009
Сообщений: 25
Цитата:
>> какую SDK вы используете для сборки?
3.4.1.10084

Чего-то не срастается... ... autobuild\3.4.0\frameworks...
да... меня это тоже смутило, но тем не менее
я вообще удалил старую версию (3.4.0), заменил ее новой и перекомпилил, но сообщения об ошибке те же

Цитата:
Да и скорее всего что-то с настройками загрузки RSL - в ваших модулях,
я этого не исключаю, поэтому и расписал всю структуру... хотя я делал всё по adobe-всим туториалам

Добавлено через 2 минуты
Цитата:
<mx:Image id="mImage" source="{mImageSource}" />
По-моему, так нельзя. http://www.adobe.com/livedocs/flex/3...ols/Image.html
в других местах такой код работает без проблем и нареканий

Цитата:
Если исправление или временное отключение этого участка не поможет, я бы стал искать проблему где-то вокруг.
я когда-то пробовал закомментировать какой-то участок типа этого и проблема исчезала... поэтому я и грешу на рендерер... попробую еще раз найти этот кусок

Создать новую тему Ответ Часовой пояс GMT +4, время: 00:29.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 00:29.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.