200 itens é muito? Tenho um aplicativo com 1,500,00 =P

To vendo que muita gente está tendo problemas com a criação atrasada dos componentes no flex, então, vamos lá:

Em primeiro lugar, temos que ter consciência de que o Flex é construído de uma forma otimizada, ou seja, ele não vai criar componentes desnecessários nem irá travar em uma operação de I/O (por sua natureza single threaded), por isso as comunicações assíncronas (que, acreditem, são boas). Mesmo tecnologias multi-thread, como Silverlight, ainda operam somente de forma assíncrona (o navegador reclama bastante quando algo prende sua thread, já que o estúpido roda os plug-ins na mesma thread do navegador, e isso é verdade para TODOS eles, não só a caca do IE).

O engine do Flex é absurdamente pesado (porém absurdamente poderoso), por isso coisas que não são necessárias em um determinado momento simplesmente não serão apresentadas.

O que fazer então?

Bom, depende muito de onde você está:

1) View States

Imagine que você queira limpar o conteúdo de todos os campos de texto de um state quando você muda pra ele (por exemplo, sair do state atual e voltar ao state de autenticação): para isso existe o evento enterState, que é disparado quando você está entrando no state (ou seja, o currentState mudou). Neste ponto, teus componentes já estarão instanciados e você poderá executar qualquer ação sobre eles alí.

Mas, imagine que você possua o seguinte código:

currentState = "OutroEstado";
cboMeuCombo.selectedIndex = 0; // Este combo está no state outro estado

Isso não vai funcionar (porque cboMeuCombo não foi instanciado ainda, da primeira vez), nem é bom colocar no enterState porque senão este código será executado TODA vez que o state mudar (e nem sempre é isso o que você quer). O que fazer então?

currentState = "OutroEstado";
callLater(function():void{cboMeuCombo.selectedIndex = 0;});

Assim, o delegate anônimo será executado durante o próximo quadro e o combo estará criado sem problemas.

2) Tab Navigators, ViewStack, etc.

Um outro ponto que dá problemas também são componentes com multi-visões, como abas, viewstack, etc. Quando o componente é criado, ele instancia apenas os filhos da aba ou stack que será imediatamente exibido. Isso significa que uma aba não pode acessar componentes de outra aba (pelo menos da primeira vez), porque eles não foram construídos ainda.

CallLater também não pode ser usado aqui, porque você não sabe exatamente quando a aba será mudada (a menos, claro, que esteja explicitamente mudando a aba via código).

Um evento interessante aqui é o show, que é disparado quando o Container (Canvas, Box, VBox, etc.) está sendo mostrado. Isso ocorre TODA vez que a outra aba é acionada, então você pode utilizar uma flag do tipo:

private var TaInicializado:Boolean = false;

E no evento show da segunda aba:

if(TaInicializado == false) { TaInicializado = true; Codigo de Inicializacao Aqui }


Uma outra solução que uso freqüêntemente é o poder do data binding do Flex:

Imagine que você queira alterar o texto de campos de texto que não foram criados ainda:

Porque não usar <mx:Text label="{VariavelString}"/> e alterar a VariavelString, ao invés da propriedade label do Text? Desta forma, irá funcionar em todos os casos, não precisa alterar a política de criação e ainda tem a vantagem de poder fazer o data binding em duas vias (ida e volta) e obter os dados para envio para uma função remota, por exemplo, sem ter que ficar checando se o componente existe.

Neste caso, é útil uma função presente em todos os componentes do Flex: executeBindings(includeChildren:Boolean).

O que esta função faz é "re-bindar" aquele componente e, opcionalmente (se passado true como parâmetro), todos os filhos daquele componente.

Flex (felizmente) exige mais um programador do que só um simples desenvolvedor. Pode parecer complicado ou frustrante à princípio mas, acredite, você vai amar o bichin assim que conseguir domesticá-lo ;-)

--------------------------------------------------
From: "Taciano.Peruzzo" <taciano.peru...@gmail.com>
Sent: Friday, November 20, 2009 8:17 PM
To: "flexdev" <flexdev@googlegroups.com>
Subject: [flexdev] Tela demora para abrir


Boa noite galera, estou desenvolvendo uma aplicação de administração
de imoveis, e está ocorrendo o seguinte:
Tenho uma tela de cadastro com muitos itens, muitos mesmos uns 200
+/- , num tabNavigator distribuidos em umas 5 abas, e precisei usar o
creationPolicy="All" para zerar os textInput de dentro dessas abas,
pois estava dando erro nesse lado, só que o tempo de criação dessa
janela aumentou consideravelmente, leva em torno de 5 segundos depois
do click para aparecer e começar a carregar os dados. Gostaria de
saber da lista se tem alguma forma de não usar o creationPolicy, ou de
agilizar a abertura. Tentei colocar um setBusyCursor, mas nao deu
certo, ele só aparece depois da janela, poderia ate ser uma
alternativa para avisar o usuario da demora. Alguém alguma sugestão?
--~--~---------~--~----~------------~-------~--~----~
Você recebeu esta mensagem porque está inscrito na lista "flexdev"
Para enviar uma mensagem, envie um e-mail para flexdev@googlegroups.com
Para sair da lista, envie um email em branco para flexdev-unsubscr...@googlegroups.com
Mais opções estão disponíveis em http://groups.google.com/group/flexdev
-~----------~----~----~----~------~----~------~--~---

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Responder a