使用SharedObject缓存游戏框架到本地和版本更新的demo
来源:互联网 发布:dronedeploy航测软件 编辑:程序博客网 时间:2024/06/05 11:30
源码中有两个工程,一个是VersionLoader。一个是mainFrame。
VersionLoader负责加载frame、和进行版本辨识。
VersionLoader通过xml文件取得服务器文件版本。与SharedObject存储在本地的文件对比,判断是重新加载MainFrame,还是在SharedObject中取得。
使用了一个xml标志服务器版本。
希望对大家有帮助。
下面是源码:
package
{
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.NetStatusEvent;
import flash.events.SecurityErrorEvent;
import flash.net.SharedObject;
import flash.net.SharedObjectFlushStatus;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.utils.ByteArray;
[SWF(width="1000", height="600", frameRate="31")]
public class VersionLoader extends Sprite
{
private var configLoader : URLLoader;
private var frameLocalLoader : Loader;
private var frameRemoteLoader : URLLoader;
//版本标识
private var version : String;
private static const MAIN_FRAME_URL : String = "MainFrame.swf";
/**
* 构造函数
*/
public function VersionLoader()
{
super();
loadConfig();
}
/**
* 加载配置文件
*/
private function loadConfig():void
{
configLoader = new URLLoader();
configLoader.load(new URLRequest(("version.xml?v=" + new Date().getTime())));
configLoader.addEventListener(Event.COMPLETE, configLoadCompleted);
configLoader.addEventListener(IOErrorEvent.IO_ERROR, configLoadError);
}
/**
* 配置文件完成处理
*/
private function configLoadCompleted(evt : Event) : void
{
trace("config load completed");
configLoader.removeEventListener(Event.COMPLETE, configLoadCompleted);
configLoader.removeEventListener(IOErrorEvent.IO_ERROR, configLoadError);
configLoader.close();
var xmlData : XML = XML(evt.target.data);
version = xmlData.version;
loadMainFrame();
}
/**
* 加载配置文件失败
*/
private function configLoadError(evt : Event) : void
{
trace("config load error");
}
/**
* 加载主框架
*/
private function loadMainFrame() : void
{
var mainFrameData : ByteArray = (readLocal("MainFrame", version) as ByteArray);
// 本地加载到数据
if (mainFrameData)
{
trace("load shell from local sharedObject");
loadFrameFromBytes(mainFrameData);
}
// 重新加载数据
else
{
trace("load new Shell");
loadFrameFromRemote();
}
}
/**
* 以bytes方式加载主框架
*/
private function loadFrameFromBytes(byteData : ByteArray) : void
{
frameLocalLoader = new Loader();
frameLocalLoader.contentLoaderInfo.addEventListener(Event.INIT, frameLocalLoadCompleted);
frameLocalLoader.loadBytes(byteData);
}
/**
* 本地加载主框架完成
*/
private function frameLocalLoadCompleted(evt : Event) : void
{
addChildAt(frameLocalLoader, 0);
}
/**
* 远程加载主框架
*/
private function loadFrameFromRemote() : void
{
frameRemoteLoader = new URLLoader();
frameRemoteLoader.dataFormat = URLLoaderDataFormat.BINARY;
frameRemoteLoader.addEventListener(Event.COMPLETE, frameRemoteLoadCompleted);
frameRemoteLoader.addEventListener(IOErrorEvent.IO_ERROR, frameRemoteLoadError);
frameRemoteLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, frameRemoteLoadError);
frameRemoteLoader.load(new URLRequest((MAIN_FRAME_URL + "?v=" + version)));
}
/**
* 远程加载主框架完成
*/
private function frameRemoteLoadCompleted(evt : Event) : void
{
trace("load frame from remote completed");
var date:ByteArray = evt.target.data as ByteArray;
loadFrameFromBytes(date);
saveLocal("MainFrame", date, version)
}
/**
* 远程加载主框架失败
*/
private function frameRemoteLoadError(evt : Event) : void
{
trace("load frame from remote error");
}
/**
* 保存到本地
*/
private function saveLocal(name : String, data : Object, version : String) : void
{
trace("save data to local name:" + name + ",version:" + version);
var shared : * = null;
var flushResult : * = null;
var name : * = name;
var data : * = data;
var version : * = version;
try
{
shared = SharedObject.getLocal(name, "/");
if (shared)
{
shared.data["version"] = version;
shared.data["data"] = data;
flushResult = shared.flush();
if (flushResult == SharedObjectFlushStatus.PENDING)
{
shared.addEventListener(NetStatusEvent.NET_STATUS, sharedNetStatus);
}
}
}
catch(err : Error)
{
trace("save to local error");
}
}
/**
* 从本地读取
*/
public function readLocal(name : String, version : String) : Object
{
trace("read data from local name:" + name + ",version:" + version);
var shared : * = null;
var name : * = name;
var version : * = version;
try
{
shared = SharedObject.getLocal(name, "/");
if (shared)
{
if (shared.data["version"] != version)
{
shared.clear();
}
else
{
if (shared.data.hasOwnProperty("data"))
{
return (shared.data["data"]);
}
}
}
}
catch(err : Error)
{
trace("read from local error");
}
return (null);
}
private function sharedNetStatus(event : NetStatusEvent) : void
{
}
}
}
- 使用SharedObject缓存游戏框架到本地和版本更新的demo
- 关于使用SharedObject来缓存游戏图片或者swf文件资源到客户端本地的研究
- 使用SharedObject保存数据到本地
- 采用SharedObject保存数据到本地
- SharedObject保存数据到本地例子
- SharedObject对象保存二进制数据到本地
- 更新本地git仓库到远程最新的版本
- 清除缓存和版本更新
- SharedObject的用法,SWF保存本地信息。
- Universalimageloader图片加载框架缓存本地图片的使用
- Android异步从网络下载图片并且缓存图片到本地的demo
- Android异步从网络下载图片并且缓存图片到本地的demo
- Android异步从网络下载图片并且缓存图片到本地的demo
- Android异步从网络下载图片并且缓存图片到本地的demo
- Android异步从网络下载图片并且缓存图片到本地的demo
- Android异步从网络下载图片并且缓存图片到本地的demo
- Android异步从网络下载图片并且缓存图片到本地的demo
- 本地缓存的使用
- Android 数据存储总结
- 用javascript面向对象的方式制作弹出层
- C#的整数类型
- C#实数类型
- 关于window.event.srcElement (触发事件的对象)
- 使用SharedObject缓存游戏框架到本地和版本更新的demo
- C#字符类型
- NSString,NSScanner,NSData,NSAttributedString
- VB6 禁止浏览器下载图片,脚本,视频,音乐及ActvieX等.
- C#布尔类型
- C#变量的命名规范
- MD5加解密
- Apologize。
- C#变量的赋值