Hi all,

I am trying to find a simple solution on caching images into the memory.

I had written a code to do that and it seemed to be working but I am
pretty sure there are things that I had missed.

Any feedback is greatly appreciated.

========================================================================

I am using associative array to store the Bitmap and using the image URL
path as the key.

Here's how the code works in general:

- You select which image that you want to load by choosing one of the
image's name in the comboBox.

- The selected image's name will be appended to a URL where the image is
located. Let's called this new appended string: "newImgURL"

- Check to see if "newImgURL" is existed in the associative array. If it
is existed, then load the cached-bitmap else pass "newImgURL"  to
imageObj.source.

- If it's passed to imageObj.source, the imageObj will throw a
"complete" event. On the completeEventHandler, cached the imageObj's
Bitmap to the associative array.

Here's the code:

<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml";
layout="horizontal" creationComplete="imageInit()">

<mx:Script>

<![CDATA[

import flash.utils.getTimer;

import mx.collections.ArrayCollection;

import mx.controls.ComboBox;

import mx.events.ListEvent;





[Bindable]

private var myArray:Array = ["Select",

"YourImageNameHere1.jpg",

"YourImageNameHere2.jpg",

"YourImageNameHere3.jpg"];

private const ResourceURL:String = "http://PutYourURL/";;





[Bindable]

private var time2:int = 0;



private var loadTime2:int = 0;



private var myDictionary:Array = new Array;



[Bindable]

private var status:String = "Not Updated";



[Bindable]

private var totalMemoryNum:uint = System.totalMemory;



[Bindable]

private var byteDiff:uint = 0;



[Bindable]

private var myLoaderContext : LoaderContext;



private function imageInit() : void

{

myLoaderContext = new LoaderContext();

myLoaderContext.checkPolicyFile = true;

}

//====================================

//Using dictionary

//====================================

private var exist:Boolean = true;

private function loadImg2(event:ListEvent):void

{

var myImgName:String = (event.target as ComboBox).selectedItem as
String;

var imgPath:String = ResourceURL + myImgName;



var myDisplayObj:DisplayObject = myDictionary[imgPath];

status = "Not Updated";

time2 = 0;

if (myDisplayObj != null)

{

//trace("Cached version");



var myImage:Bitmap = myDisplayObj as Bitmap;

FlipSource2.load(new Bitmap(myImage.bitmapData));

}

else

{

exist = false;

FlipSource2.source = imgPath;

}



byteDiff = System.totalMemory - totalMemoryNum;

totalMemoryNum = System.totalMemory;



loadTime2 = getTimer();

}



private function takeDiffTime2():void

{

if (!exist)

{

status = "Updated";

var myCloneBitmapData:BitmapData = (FlipSource2.content as
Bitmap).bitmapData.clone();

var image:Bitmap = new Bitmap(myCloneBitmapData);

myDictionary[FlipSource2.source] = image;

}

time2 = getTimer() - loadTime2;

}

]]>

</mx:Script>





<mx:VBox width="100%" height="100%" >

<mx:ComboBox dataProvider="{myArray}" labelField="label"
change="loadImg2(event)"/>

<mx:Label id="LoadTime2" text="Total Load Time: {time2} ms - {status}"/>

<mx:HBox width="100%" height="100%" horizontalAlign="center">

<mx:Image id="FlipSource2" width="480" height="480"
horizontalAlign="center" complete="takeDiffTime2();trace('Image Load2
Complete')" cachePolicy="off"

cacheAsBitmap="false"

loaderContext="{myLoaderContext}"/>

</mx:HBox>

</mx:VBox>

<mx:VBox width="100%">

<mx:Label id="TotalMemory" text="Total Memory: {totalMemoryNum/1024}
KB"/>

<mx:Label id="DiffMem" text="Byte Diff: {byteDiff/1024} KB"/>

<mx:Label text="Version 1.0" />

</mx:VBox>

</mx:Application>





Reply via email to