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>