Apache Adobe Flex TutorialTutoriaux Adobe Flex & AIR en Français

28oct/114

Flex Tip – Intercepter tous les dispatch d'évènement d'une application Flex (logging, …)

Avant de vous présenter ce "tip", je vais quand même présenter le site sur lequel je l'ai trouvé, qui s'appelle Flex Army kNife:

http://www.flexarmyknife.org/

Un blog que j'ai découvert aujourd'hui (il n'est jamais trop tard) et qui contient quelques perles, notamment sur des sujets assez avancés. Il est tenu par @benzonico et @epascal, des suisses que j'ai pu rencontrer lors de Back From MAX Paris. Ils avouent eux-même que le blog n'est pas souvent mis à jour, faute de temps mais cet article va peut-être les encourager :)

Le tip du jour est sur cet article:

http://www.flexarmyknife.org/2010/09/logging-all-events-of-flex-application.html?spref=tw

Un petit article qui date de Septembre 2010 mais qui peut vous être utile, notamment lorsque vous faites un debug assez laborieux sur un système très asynchrone. A partir d'une certaine complexité, il est difficile de s'y retrouver et parfois, on aimerait juste mettre un point d'arrêt sur tel et tel type d'évènement.

Le code suivant permet d'ajouter un "hook" et de s'abonner au dispatch de tous les évènements:

import mx.core.mx_internal;
private static function hookDispatchEvent():Boolean
{
   UIComponent.mx_internal::dispatchEventHook = logEventHook;
   return true;
}
private static function logEventHook( event:Event, uic:UIComponent ):void
{
   trace(event.toString()+" event dispatched from "+uic.toString()+ " to "+event.currentTarget);
}

Vous allez ainsi récupérer l'objet Event ainsi que le composant qui a dispatché l'évènement. Pour placer plus stratégiquement votre point d'arrêt, vous pouvez simplement faire un test sur la propriété "type" de l'Event ou sur le type de UIComponent qui a propagé l'évènement.

Remplis sous: Debugging 4 Commentaires
13sept/100

AIR pour Android – Détecter une sortie d'application avec Event.ACTIVATE / Event.DEACTIVATE

Pour certaines rainsons fonctionnelles, vous aurez peut-être besoin de savoir lorsque l'utilisateur a quitté votre application pour retourner sur l'écran d'acceuil. Vous voulez peut-être aussi savoir quand il vient de revenir de l'écran d'accueil et qu'il arrive à nouveau sur votre application (afficher une notification etc…).

Vous pouvez déterminer ces instants par les évènements de base (aussi valable en Flex Web quand l'application perd le focus) Event.ACTIVATE et Event.DEACTIVATE.

Il suffit d'écouter ces évènements sur la propriété "stage" de votre application, au moins après l'évènement APPLICATION_COMPLETE.

Notez que vous pouvez effectuer des actions juste avant que l'application ne revienne sur le home screen (désactiver des éléments, ralentir le rafraichissement, …). De manière automatique, l'application se met "en veille" lorsqu'elle n'a pas le focus. Dans ce mode-là, elle est jouée à 4fps sauf si une vidéo est jouée. Si une vidéo se trouve dans l'application, celle-ci continuera à fonctionner de manière normale, même en arrière-plan.

Code de démonstration

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" paddingLeft="0" paddingRight="0"
                paddingTop="0" paddingBottom="0"
                applicationComplete="application1_applicationCompleteHandler(event)">
  <mx:Style>
    global {
      font-size: 24;
    }
  </mx:Style>
  <mx:Script>
    <![CDATA[
      import mx.events.FlexEvent;

      /**
       *
       */
      protected function application1_applicationCompleteHandler(event:FlexEvent):void {
        this.stage.addEventListener(Event.ACTIVATE, onActivate);
        this.stage.addEventListener(Event.DEACTIVATE, onDeactivate);
      }

      public function onActivate(event:Event):void {
        showInfo("Activate");
      }

      public function onDeactivate(event:Event):void {
        showInfo("Deactivate");
      }

      private function showInfo(text:String):void {
        log.text += text + "\n";
      }
    ]]>
  </mx:Script>
  <mx:ApplicationControlBar left="0" right="0" bottom="0" height="80" paddingTop="8" paddingLeft="8"
                            paddingBottom="8" paddingRight="8" horizontalGap="8" verticalGap="8"
                            dock="true">
    <mx:Box>
      <mx:Label text="Listens Activate/Deactivate" />
      <mx:Label text="Exit the application with HOME" />
    </mx:Box>
  </mx:ApplicationControlBar>
  <mx:TextArea id="log" backgroundColor="white" width="100%" height="100%" enabled="false" />
</mx:Application>

Télécharger le projet au format FXP

Télécharger l'application au format APK

25mai/103

Flex Library – Gérez vos évènements AS3 avec EventController

EventController est une petite librairie AS3 qui pourrait vous aider dans vos projets AS3 et/ou Flex. Au plus on essaie de créer une architecture ayant un couplage faible, plus on utilise d'évènement qui permettent de s'affranchir de ce couplage et permettent d'obtenir des composants ré-utilisables.

Comme le plus souvent, on veut transporter de la données avec l'évènement, on va créer de nouveaux évènements personnalisés. On se retrouve donc à écouter et à propager de nombreux évènements et leur gestion peut-être difficile, ce qui peut mener à des fuites mémoire.

EventController, Event Management made easy. An Actionscript 3 Library

EventController API Documentation

La librairie AS3 EventController essaie de rendre cette gestion plus aisée à travers plusieurs points tout en utilisant le système évènementiel de base de l'AS3.

Utilisation de la classe EC (EventController)

Dans un contexte simple, vous auriez, pour vous inscrire à un évènement:

obj.addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0.0, useWeakReference:Boolean = false):void

Avec EventController, on passe par une méthode static de EventController et on passe en plus, l'objet sur lequel on va écouter l'évènement dans la méthode:

EC.add(obj,type,listener,false,0,false,"myCluster");

Dans ce cas, l'EventController est global (un singleton global au contexte applicatif). Vous pouvez aussi créer un LEC (Local EventController). Pour cela, il suffit de créer une instance du LEC et les méthodes de l'instance du LEC sont les mêmes que celles de l'EC:

var lec:LEC = new LEC();
lec.add(obj,type,listener);

Clusters d'évènements

Un des plus de cette librairie est le système de cluster. Celui va vous permettre de créer des "groupes d'évènement". Vous pourrez ensuite gérer l'ensemble des évènements du groupe d'un seul coup.

19oct/097

Flex Modules – Communication découplée entre modules avec EventBroker

On l'a vu dans les articles précédents, la communication avec les modules Adobe Flex peut se révéler difficile s'il on essaie de découpler complètement les modules de l'application Flex. Pour cela, on peut utiliser une interface ActionScript qui va permettre de brider la transaction à certaines méthodes identifiées. Cette méthode permet déjà de découpler le module de l'application de manière significative. Mais pour une communication dans les deux sens, cela peut devenir assez coûteux.

Une solution que j'utilise en environnement professionnel consiste à se servir de l'excellente classe EventBroker de Development Arc. Celle-ci permet en effet d'utiliser le Design Pattern Mediator pour avoir un objet commun (Singleton Facade) qui va s'occuper uniquement du transit des évènements dans l'application. Cette classe que vous pouvez utiliser simplement dans votre application va nous servir de point d'entrée pour la communication module/application ou application/module ou même module/module.

En utilisant simplement cette classe et quelques évènements personnalisés, vous pourrez créer cette communication de manière aisée. Voyons un petit d'exemple d'application:

Application Principale

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
  <mx:Script>
    <![CDATA[
      import events.ApplicationEvent;
      import mx.controls.Alert;
      import events.ProductTypeSelectionEvent;
      import util.EventBroker;

      private function onFirstModuleReady():void {
        EventBroker.subscribe(ProductTypeSelectionEvent.USER_SELECTION, onProductSelectionEvent);
      }

      private function onProductSelectionEvent(event:ProductTypeSelectionEvent):void {
        var selectedItem:String = event.selectedItem;
        Alert.show("Application::Selection dans le Module FirstModule: " + selectedItem);
      }

      private function onSendEventToModules():void {
        var selectedNumber:int = magicNumberStepper.value;
        var event:ApplicationEvent = new ApplicationEvent(ApplicationEvent.ON_MAGIC_NUMBER, selectedNumber);
        EventBroker.broadcast(event);
      }
    ]]>
  </mx:Script>
  <mx:HBox width="100%"
           height="100%">

    <mx:Panel title="Application Principale"
              paddingLeft="10"
              paddingRight="10"
              paddingTop="10">
      <mx:Text text="Le nombre choisi sera envoyé vers les deux modules par un evènement de type ApplicationEvent"
               width="350"/>
      <mx:Button label="Envoyer un Event depuis l'application"
                 click="onSendEventToModules();"/>
      <mx:NumericStepper id="magicNumberStepper"
                         value="38"/>
    </mx:Panel>
    <mx:ModuleLoader url="FirstModule.swf"
                     ready="onFirstModuleReady();"/>
  </mx:HBox>
  <mx:HBox width="100%"
           height="100%">
    <mx:ModuleLoader url="SecondModule.swf"/>
  </mx:HBox>
</mx:Application>

Pour cette application de démonstration, on écoute un évènement de type ProductTypeSelectionEvent.USER_SELECTION qui sera envoyé par un module. Au clic sur le bouton, on va envoyer en broadcast, un évènement de type ApplicationEvent.ON_MAGIC_NUMBER, qui va contenir le nombre choisi dans le NumericStepper.