0

J'ai un composant de liste déroulante utilisant un rendu d'élément basé sur ImageCell personnalisé. Je sais que parfois certaines des images qu'il essaie de récupérer ne seront pas trouvées et je suis capable de gérer cela via un écouteur IEOrror sur le chargeur ImageCell personnalisé. Cependant, si je définis le fournisseur de données, alors il est changé avant que toutes les images aient terminé leur processus de chargement ou d'erreur, le lecteur de débogage flash lève une erreur # 2044 non gérée dans firefox indiquant qu'une image n'a pas pu être trouvée. Dans l'opéra avec le joueur de débogage il jette un # 2044 indiquant qu'une charge n'a jamais été accomplie.Comment gérer les erreurs Unhandled # 2044 de la liste des éléments Flash lors du changement de fournisseur de données?

Je ne trouve pas un moyen d'intercepter et d'ignorer ces erreurs afin qu'ils ne lancent pas la boîte de dialogue du débogueur. De plus, lorsque vous utilisez l'EDI de Flash Builder pour déboguer, le débogueur ne casse pas du tout ces erreurs - c'est seulement dans le lecteur alors que je suis capable de casser d'autres erreurs sans problème. C'est comme si l'écouteur d'erreur était éliminé quand le fournisseur de données changeait, mais le chargeur continuait et renvoyait un # 2044 non géré.

Des idées sur la façon de gérer l'effectivel? Merci d'avance pour votre temps et de l'assistance -

b

Répondre

2

Dans le constructeur de votre CellRenderer personnalisée, vous devez ajouter un écouteur d'événement à la protection chargeur instance et gérer la IOError.

Voici un exemple:

package 
{ 
    import fl.controls.listClasses.ICellRenderer; 
    import fl.controls.listClasses.ImageCell; 
    import fl.controls.TileList; 
    import fl.data.DataProvider; 
    import fl.managers.StyleManager; 
    import flash.events.EventDispatcher; 
    import flash.events.*; 
    import fl.containers.UILoader; 

    public class CustomImageCell extends ImageCell implements ICellRenderer 
    { 

     public function CustomImageCell() 
     { 
      super(); 

      //do other stuff here 

      loader.scaleContent = false; 
      loader.addEventListener(IOErrorEvent.IO_ERROR, handleErrorEvent, false, 0, true); 

      useHandCursor = true; 
     } 

     override protected function drawLayout():void 
     { 
      var imagePadding:Number = getStyleValue("imagePadding") as Number; 
      loader.move(11, 5); 

      var w:Number = width-(imagePadding*2); 
      var h:Number = height-imagePadding*2; 
      if (loader.width != w && loader.height != h) 
      { 
       loader.setSize(w,h); 
      } 
      loader.drawNow(); // Force validation! 

     } 
     override protected function handleErrorEvent(event:IOErrorEvent):void { 
      trace('ioError: ' + event); 
      //dispatchEvent(event); 
     } 
    } 
} 

ici est un test simple, je l'ai fait pour voir ce qui se passe lorsque le fournisseur de données est mise à jour:

import fl.controls.*; 
import fl.data.DataProvider; 
import fl.controls.listClasses.CellRenderer; 

stage.scaleMode = StageScaleMode.NO_SCALE; 
stage.align = StageAlign.TOP_LEFT; 

var tileList:TileList = new TileList(); 
tileList.move(220,40); 
tileList.setSize(215, 400); 
tileList.columnWidth = 215; 
tileList.rowHeight = 86; 
tileList.direction = ScrollBarDirection.VERTICAL; 
tileList.setStyle("cellRenderer", CustomImageCell); 
addChild(tileList); 

tileList.dataProvider = getRandomDP(10); 
setTimeout(resetDP,3000); 

function resetDP():void { 
    tileList.dataProvider = getRandomDP(10); 
} 
function getRandomDP(size:int):DataProvider { 
    var result:DataProvider = new DataProvider(); 
    for(var i:int = 0; i < size; i++) result.addItem({label:'item'+i,source:'wrong.url/'+Math.random()}); 
    return result; 
} 

HTH

+0

Je suis en train de faire exactement cela. Le gestionnaire attrape IOErrors pendant le chargement de la liste, mais si je change le fournisseur de données, je reçois les paquets non traités comme si les chargeurs qui auraient dû être éliminés pendant la modification du fournisseur de données envoyaient IOErrorEvents qui ne sont plus manipulés car le chargeur lui-même est disparu. – WillyCornbread

+0

@WillyCornbread Est-ce que vous voulez dire en changeant le dataprovider? Dans mon test minuscule, même si le fournisseur de données change, le comportement est le même. –

+0

George - La solution était en effet dans votre réponse originale. J'ajoutais mon propre gestionnaire IORErrorEvent au chargeur protégé, mais je ne surchargeais pas la méthode protégée 'handleErrorEvent' du chargeur. Une fois que j'ai utilisé un remplacement de cela, le problème s'est arrêté. Merci beaucoup pour l'aide. – WillyCornbread

Questions connexes