0

この記事http://www.adobe.com/devnet/flex/articles/flex-mobile-performance-checklist.htmlを読んで、ビューの外観を creationComplete ハンドラーで初期化してはいけません。代わりに、オーバーライドされたデータ セッターでビューの外観を変更する必要があります。

この記事のセクションは次のとおりです。

バインディングを使用したり、creationComplete ハンドラーでビューの外観を初期化したりする代わりに、データ セッターをオーバーライドします。

1-まず、次のことを行ってこれが正しいかどうかを知りたいです。

//My code is loading a set of images and adding them in a View. 
//On creationComplete of the View I am adding the images in case this is the first time          
//the view is shown. In case the view has been already accessed I use the data:  

   protected function view1_creationCompleteHandler(event:FlexEvent):void
        {
            if(!data) //On first creation of the view I create the data object
            {
                data = new Object();
                data.imageArray = new Array(); //set an array that will cache my images.
                for(var i:int = 0; i<36;i++)
                {
                    var img:Image = new Image();
                    img.source = 'assets/0'+i.toString()+'.png';
                    container.addElement(img);
                    (data.imageArray as Array).push(img);//Override the data for next time!
                }
            }
            else//Next time use the save images
            {
                for(var ix:int = 0; ix<(data.imageArray as Array).length;ix++)
                {
                    container.addElement((data.imageArray as Array)[ix]);
                }
            }
        }

これを正しく行っている場合、どのアプローチが最適かを知りたいです。上記のもの、または ContentCache でキャッシュとキューイングが有効になっている画像 contentLoader を使用する次のものを示します。

  protected function view1_creationCompleteHandler(event:FlexEvent):void
        {
            {
                for(var i:int = 0; i<36;i++)
                {
                    var img:Image = new Image();
                    img.contentLoader = ldr;
                    img.contentLoaderGrouping = 'gr1';
                    img.source = 'assets/0'+i.toString()+'.png';
                    container.addElement(img);
                }

        }

<fx:Declarations>
    <s:ContentCache id="ldr" enableQueueing="true"
                    maxActiveRequests="1" maxCacheEntries="36"/>
</fx:Declarations>

また、誰かが contentLoaderGrouping の目的を教えてくれたら。私は非常に感謝されます。どうもありがとう!!!

PS:ちなみに、両方のアプローチが機能します。最初のアプローチはインスタントですが、2 番目のアプローチは、実際にクールな効果を与える非常にスムーズな方法で画像が追加されていることを示しています。

4

1 に答える 1

1

ない。提案のポイントは、作成完了後にディスプレイリストを変更しないことでした。これには、追加の更新サイクルが必要です。代わりに、ビューをスタックにプッシュするときにデータ プロパティを挿入し、セッターで変更を開始する必要があります。ContentCache の使用はそれとは関係ありません (正しく使用しないと、追加のオーバーヘッドが発生する場合があります)。

override public function set data(value:Object):void
{
    super.data = value;

    //this was poorly optimized, so I made it
    //a little better...

    var imageArray:Array = (value == null || value.imageArray == null)?
        null : value.imageArray as Array;

    if(imageArray == null) //On first creation of the view I create the data object
    {
        imageArray = new Array(36); //set an array that will cache my images.
        for(var i:int = 0; i<36;i++)
        {
            var img:Image = new Image();
            img.source = 'assets/0'+i.toString()+'.png';
            container.addElement(img);
            imageArray[i] = img;
        }

        super.data = {imageArray:imageArray}
    }
    else//Next time use the save images
    {
        var n:int = imageArray.length;
        for (var j:int = 0; j < n; j++) 
        {
            container.addElement(IVisualElement(imageArray[j]));
        }
    }
}

編集

ビューのライフサイクル中にデータ プロパティがいつ設定されるかを間違えていました。

仕組みは次のとおりです。

ライフサイクル図を見る

したがって、その時点でコンテナーが null になることは正しいです。私はあなたのために例を書くつもりでしたが、ここであなたの最終目標が何であるかを理解するのに苦労しています. データ プロパティに画像を保存する特定の理由はありますか? あなたが実際にやりたいことはこれだと思います:

private var _data:Object = {cache: new ContentCache()};

protected function show_clickHandler(event:MouseEvent):void
{
    this.navigator.pushView(views.MyView, _data);
}

そして景色に…

<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" title="MyView">

    <fx:Script>
        <![CDATA[
            import spark.components.Image;
            import spark.core.ContentCache;

            override protected function createChildren():void
            {
                super.createChildren();

                //you might want to do a sanity first check to make sure the 
                //data was passed in correctly...

                var cache:ContentCache = ContentCache(this.data.cache);

                for(var i:int = 0; i < 36; i++)
                {
                    var img:Image = new Image();
                    img.contentLoader = cache;
                    img.source = 'assets/0' + i.toString() + '.png';
                    container.addElement(img);
                }
            }
        ]]>
    </fx:Script>

    <s:VGroup id="container" />

</s:View>
于 2013-11-13T22:18:20.970 に答える