Cachování externích dat

22.7.2011· Autor: Ondřej Brichta· Počet komentářů: 8

Pojďme se v dnešním článku seznámit s jednou z možností, jak v ActionScriptu umožnit cachování externích dat ve flashových aplikacích.

Povolení cachování

S nárůstem flashových aplikací, ve kterých pracujeme s velkým objemem dat, která jsou následně vizualizována, rostou i nároky na plynulou funkčnost a především zobrazení takových dat.

Pokud se podíváme na řadu komponent ve Flash/Flex Builderu, řada z nich umožňuje pomocí vlastních ItemRendererů upravovat vzhled seznamů, kde nejčastější úpravou je doplnění ikonek nebo větších obrázků. Podobné komponenty najdeme i ve Flashi.

Další velkou kapitolou jsou mobilní aplikace, kde je často škoda(pokud není uživatel připojen na wifi) zahodit „pracně" načtené obrázky například při listování nejrůznějšími seznamy.

Našla by se i řada dalších situací, kdy je škoda „zahodit" již jednou načtená data, která můžeme opakovaně využívat.

Třída pro ukládání ByteArray

Pokud se budeme bavit o externích datech, nejlepším formátem pro ukládání externích dat je třída ByteArray, pomocí které uložíme přesně to, co externě načteme. Jednoduchá třída tak může vypadat takto:

package 
{
 import flash.utils.ByteArray;
 public class ImageCache
 {
 public function ImageCache()
 {
 }
 private static var cachedContent:Array = new Array();
 private static var cachedContentKeys:Array = new Array();
 public static function addObject(obj:ByteArray,key:String):void{
 if(!isCached(key)){
 var copy:ByteArray = new ByteArray();
 obj.position = 0;
 copy.position = 0;
 obj.readBytes(copy,0,obj.length);
 cachedContent.push(copy);
 cachedContentKeys.push(key);
 }
 }
 public static function isCached(key:String):Boolean{
 var indx:int = cachedContentKeys.indexOf(key);
 var ret:Boolean = true;
 if(indx==-1){
 ret = false;
 }
 return ret;
 }
 public static function getObject(key:String):ByteArray{
 var ret:ByteArray;
 if(isCached(key)){
 var indx:int = cachedContentKeys.indexOf(key);
 var obj:ByteArray = cachedContent[indx] as ByteArray;
 var copy:ByteArray = new ByteArray();
 obj.position = 0;
 copy.position = 0;
 obj.readBytes(copy,0,obj.length);
 ret = copy;
 }
 return ret;
 }
 public static function clearCache():void{
 cachedContent = new Array();
 cachedContentKeys = new Array();
 }
 }
}

Použití třídy je velmi snadné, pokud chceme do cache objekt uložit, použijeme tento příkaz:

var ldr:Loader = new Loader();
// načtení externího obsahu....
var ba:ByteArray = ldr.contentLoaderInfo.bytes; 
ImageCache.addObject(ba,"obrazek.jpg");

Pomocí metody „addObject" vložíme do „cache" objekt ByteArray, který v tomto případě získáme z objektu Loader přes vlastnost contentLoaderInfo.bytes. Je potřeba si data uložit pod nějakým jedinečným klíčem, abychom je pod tímto klíčem uměli zase zjistit. Ideálně se tady nabízí přímo název externího souboru.

Jakmile máme objekt v cachi, můžeme jej kdykoliv získat přes metodu getObject:

if(ImageCache.isCached("obrazek.jpg")){
 ldr.loadBytes(ImageCache.getObject("obrazek.jpg"));
}

Využijeme přitom metodu loadBytes, kterou lze do objektu Loader načíst ByteArray data.

 

Poznámka: Při načtení externího obrázku(objekt Bitmap), jeho vložení do cache a následném načtení je v Loader objektu v podobě MovieClipu, ve kterém je vložen objekt Bitmap.

 

ImageCache.zip

Ondřej Brichta Vývojář flashových a mobilních AIR aplikací, šéfredaktor Flash.cz, školitel produktů Flash, Flex, Flash Media Server

E-mail: ob(zavinac)obria.cz | Web: http://www.obria.cz |

Motto: <°))))><

Komentáře k článku  
Hodí sa Raa | 25.7.2011 11:48
slovo OBr | 27.7.2011 12:05
Asi takto.. Raa | 29.7.2011 13:23
oprava OBr | 1.8.2011 14:20
K cemu to? purportex | 2.8.2011 7:57
účel OBr | 3.8.2011 12:09
Re Zwick | 2.2.2012 20:10
Re Zwick | 2.2.2012 20:10

Přihlášení uživatele