`
hereson3
  • 浏览: 162982 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

使用SharedObject及捕获异常

阅读更多

【使用SharedObject及捕获异常】
var so:SharedObject = SharedObject.getLocal("so");
so.data.userName = "Youthoy";
try {
var flushResult:String = so.flush(500 * 1024); //请求500KB容量
//如果flush()没成功执行,就替netStatus加个事件处理函数以确认用户是同意还是拒绝,否则只检验结果.
if(flushResult == SharedObjectFlushStatus.PENDING) {
//替netStatus加个事件处理函数,使得我们可以检验用户是否同意以足够磁盘容量储存共享对象.当netStatus事件发生时,执行onStatus函数.
so.addEventListener(NetStatusEvent.NET_STATUS, onStatus);
}else if(flushResult == SharedObjectFlushStatus.FLUSHED) {
//成功储存.把数据成功储存后你想执行的程序放在这里.
}
}catch(e:Error) {
//这里表示用户把本地储存设置为"拒绝".如果储存数据很重要,你会想在此警告用户.
//此外,如果你想让用户可修改其设定值,可以用下面语句打开Player的"设置"对话框的本地储存页面.
Security.showSettings(SecurityPanel.LOCAL_STORAGE);
}
//定义onStatus函数以处理共享对象的状态事件.flush()返回"pending"时,引发提示,而用户做了选择后所引发的事件.
function onStatus(event:NetStatusEvent):void {
if(event.info.code == "SharedObject.Flush.Success"){
//如果event.info.code内容是"SharedObject.Flush.Success",表示用户同意.把用户同意后你想执行的程序放在这里.
}else if(event.info.code == "SharedObject.Flush.Failed"){
//如果event.info.code内容是"SharedObject.Flush.Failed",表示用户同意.把用户拒绝后你想执行的程序放在这里.
}
//现在,移除事件监听器,因为我们只需监听一次.
so.removeEventListener(NetStatusEvent.NET_STATUS, onStatus);
}

【向LSO储存对象时需要注意】
LSO使用二进制的AMF(Action Message Format)对一个对象进行编码.当你在LSO储存类对象时,该对象会编码成包含内容属性的普通对象.于是,当你试着从共享对象里读取该对象时,无法被读成某类的对象,因为没有类型数据.要克服这个限制,使用flash.net.registerClassAlias()方法.
任何影片中,只要从共享对象读取出自定义对象数据,自定义类就必须注册别名,而且调用registerClassAlias()方法时必须在SharedObject.getLocal()方法被调用之前.

【要相同域名内的两个影片可以存取相同LSO】
首先LSO是储存在以下目录下:
C:\Documents and Settings\[user name]\Application Data\Macromedia\Flash Player\#SharedObjects
例如,如果来自于http://www.riahome.cn/youthoy 的影片movie.swf写入名为example的LSO,则数据会储存在以下位置:
C:\Documents and Settings\[user name]\Application Data\Macromedia\Flash Player\#SharedObjects\[random directory name]\riahome.cn\youthoy\movie.swf\example.sol
如果在这个movie.swf里的代码是这样的: var example:SharedObject = SharedObject.getLocal("example", "/"); 也就是使用了选用的本地路径参数,则LSO会储存在以下路径,注意到与以上路径少了"youthoy\movie.swf":
C:\Documents and Settings\[user name]\Application Data\Macromedia\Flash Player\#SharedObjects\[random directory name]\riahome.cn\example.sol
以此方法建立的LSO,可以由相同域的其它Flash影片用以下程序来读取:
var example:SharedObject = SharedObject.getLocal("example", "/");
再看一个例子:
有两个Flash影片movieOne.swf和movieTwo.swf都位于同一域(http://www.riahome.cn )内,但是,movieOne.swf位于http://www.riahome.cn/youthoy/firstGroup ,而movieTwo.swf位于http://www.riahome.cn/youthoy/secondGroup. 在这情况里,movieOne.swf可以用下列任何本地路径建立和读取LSO:
/
/youthoy
/youthoy/firstGroup
而movieTwo.swf可以用下列任何本地路径建立和读取LSO:
/
/youthoy
/youthoy/secondGroup
因此,如果你想要两个影片都可以读取相同LSO,当你调用getLocal()方法时,必须指定影片共享的两个本地路径之一(/或/youthoy).

【URLLoader.dataFormat的三种类型】
URLLoader.dataFormat的可选值是:
flash.net.URLLoaderDataFormat.BINARY
flash.net.URLLoaderDataFormat.TEXT
flash.net.URLLoaderDataFormat.VARIABLES
当dataFormat是BINARY时,URLLoader.data属性就是flash.utils.ByteArray类型;
当dataFormat是TEXT时,URLLoader.data属性就是String类型;
当dataFormat是VARIABLES时,uRLLoader.data属性就是Object类型.

【在XML内使用动态数据】
把变量放在大括号({和})内:
var userName:String = "Youthoy";
var myXML:XML = <person><userName>{userName}</userName></person>;

【新增一个节点元素】
//例子一:
var example:XML = <person/>;
example.father = <father/>; //内容属性和元素名称不一定要相同,也可以: example.abc = <father/>,但会以元素名称为准,即会建立一个<father/>元素
trace(example);
/*
输出:
<person>
<father/>
</person>
*/
//例子二:
var example:XML = <person/>;
example.father = ""; //建立一个<father/>元素
trace(example.toString());
/*
输出:
<person>
<father/>
</person>
*/
//例子三:
var example:XML = <person/>;
var id:int = 10;
example["user" + id] = "";
trace(example);
/*
输出:
<person>
<user10/>
</person>
注意: 有些情况必须使用第三种情况.例如,元素节点名称内含连字符("-")是完全合法的,但在ActionScript里会得到编译器错误:
example.some-element = ""; //产生编译器错误
正确的写法是:
example["some-element"] = "";
*/

【新增属性】
var example:XML = <person/>;
example.element = "";
example.element.@name = "Youthoy";
example.element.@["bad-variable-name"] = "yes";
example.element.@other = ["riahome.cn", undefined, true, 44, null];
var id:int = 44;
example.element.@["user" + id] = "love";
trace(example);
/*
输出:
<person>
<element name="Youthoy" bad-variable-name="yes" other="riahome.cn,,true,44," user44="love"/>
</person>
*/

【向XML插入文字元素和节点元素】
//在指定元素前和后插入,在最前端和尾端插入
var example:XML = <person/>;
example.two = "";
example.insertChildBefore(example.two, <one/>); //在two节点前插入one节点
example.insertChildBefore(example.two, "在two节点前插入文字");
example.insertChildAfter(example.two, <three/>); //在two节点后插入three节点
example.prependChild(<start/>); //在最顶端插入start节点
example.appendChild(<end/>); //在尾端插入end节点
example.start = "start内容"; //向节点增加内容
trace(example);
/*
输出:
<person>
<start>start内容</start>
<one/>
在two节点前插入文字
<two/>
<three/>
<end/>
</person>
*/

【把XML实例的内容属性转换为任何可以转换成字符串的内容】
//先把等号右边转为可以转换的字符串
var example:XML = <person/>;
example.one = "one";
example.two = new URLLoader();
example.three = new Sprite();
example.four = new Boolean; //Boolean对象的值初始化为false
example.five = new Number();
example.six = new String();
example.seven = {a:"Youthoy", b:true, c:undefined};
example.eight = ["three", undefined, true, 44, null];
/*
输出:
<person>
<one>one</one>
<two>[object URLLoader]</two>
<three>[object Sprite]</three>
<four>false</four>
<five>0</five>
<six/>
<seven>[object Object]</seven>
<eight>three,,true,44,</eight>
</person>
*/

【对XML属性层层递归的算法】
var example:XML = <menu>
<menuitem label="File">
<menuitem label="New"/>
<menuitem label="Save"/>
</menuitem>
<menuitem label="Help">
<menuitem label="About"/>
</menuitem>
</menu>;
walk(example);
function walk(node:XML):void {
for each(var element:XML in node.elements()) {
trace(element.@label);
walk(element);
}

【读取文字节点及其值】
var example:XML = <menu>
My name is Youthoy.
<myName>Youthoy</myName>
</menu>;
example.text(); //输出: My name is Youthoy.
example.myName.toXMLString(); //输出: <myName>Youthoy</myName>
//以下三行都输出: Youthoy
example.myName.toString();
example.myName.text();
example.myName;

【递归元素属性时读取属性名与其值】
var example:XML = <person name="Youthoy" age="21"/>;
for each(var i:XML in example.attributes()) {
trace(i.name() + "=" + i);
}
/*
输出:
name=Youthoy
age=21
*/
另类方法:
var example:XML = <person name="Youthoy" age="21"/>;
trace(example.@*[1]); //输出: 21

【不论层级地访问整个XML中指定的节点或属性】
使用后代存取器运算符..
例子1(对于节点元素):
var example:XML = <a>
<z>I am z.</z>
<b>
<c></c>
<z>I am z.</z>
</b>
</a>;
trace(example..z.text()); //输出: I am z.I am z.
例子2(对于属性):
var example:XML = <person>
<a>
<item name="Youthoy" age="21"/>
</a>
<item name="Jimpa" age="21"/>
</person>
trace(example..@name); //输出: YouthoyJimpa

【删除节点元素,文字节点以及属性】
使用delete对单一项进行删除,要删除整个XMLList可以使用for循环以倒序形式进行删除,以避免迭代时需要改变数组索引问题.

【搜索XML的高级应用】
使用术语过滤.(condition),可结合正则表达式来使用.
例子:
var example:XML = <foodgroup>
<fruits>
<fruit color="red">Apple</fruit>
<fruit color="orange">Orange</fruit>
<fruit color="green">Pear</fruit>
<fruit color="red">Watermelon</fruit>
</fruits>
<vegetables>
<vegetable color="red">Tomato</vegetable>
<vegetable color="brown">Potato</vegetable>
<vegetable color="green">Broccoli</vegetable>
</vegetables>
</foodgroup>;
trace(example..*.(hasOwnProperty("@color") && @color == "red"));
/*
hasOwnProperty所做的检测是确保元素具有color属性,然后,有的话,就测试color属性之值是否为red.只有当条件的计算结果为true时,该元素才会加入EX4运算式所返回的XMLList.
输出
<fruit color="red">Apple</fruit>
<fruit color="red">Watermelon</fruit>
<vegetable color="red">Tomato</vegetable>
*/

【CDATA(Character Data)标签】
<![CDATA[]]>,必须大写.如果<![CDATA[[]]]>这样的话,它会告诉你语法错误的.

【一些名词】
RPC:
全称: Remote Procedure Call,台湾的朋友称其为: 远端程序呼叫
SOAP:
全称: Simple Object Access Protocol,台湾的朋友称其为: 简单物体存取协定
WSDL:
全称: Web Service Description Language,台湾的朋友称其为: web service描述语言

分享到:
评论

相关推荐

    Inside the C++ Object ModLe

    理解如何正确地抛出和捕获异常,以及`try`、`catch`和`throw`关键字的工作原理,能帮助编写健壮的代码。 总之,《深入理解C++对象模型》这本书将带你探索C++的内在世界,揭示语言背后的工作原理,帮助你成为一名更...

    Adobe+Flash+cs5+ActionScript3参考文档

    ActionScript 3.0还引入了强大的网络通信功能,例如XMLSocket、URLLoader和SharedObject,它们使得Flash应用程序能够与服务器进行实时数据交换。文档会解释如何使用这些类进行HTTP、FTP和WebSocket通信,以及如何...

    opencv-4.5.5编译后的jar包和linux平台的so文件

    4. **异常处理**:在Java代码中进行适当的错误处理,如使用try-catch语句捕获可能出现的JNI异常。 5. **性能优化**:虽然Java接口提供了便利,但直接调用C++接口可能更高效。如果性能是关键因素,可以考虑使用JNI...

    ActionScript 3.0 语言和组件参考

    - **抛出和捕获异常**:使用throw关键字抛出异常,try-catch-finally语句块进行异常处理,确保程序的健壮性。 7. **网络编程**: - **XMLSocket** 和 **URLLoader**:用于实现网络通信,如发送和接收XML、JSON或...

    聊天室(ActionScript 3.0实现)

    可以使用服务器端的Session或客户端的SharedObject来保存状态信息。 10. **界面响应与更新**:用户输入消息后,界面需要实时更新,显示新消息。这通常通过事件驱动的编程模型实现,每当接收到新消息,就触发界面...

    Visual C++6.0高级编程技巧与实例.rar

    4. **异常处理**:理解异常处理机制,如何抛出和捕获异常,以及如何编写健壮的异常安全代码。 5. **STL(Standard Template Library)**:深入学习容器(如vector、list、map等)、算法和迭代器的使用,提升代码...

    untiy 安卓sqlite所需dll

    当SQLite操作出错时,可以通过捕获异常来处理错误。在开发过程中,可以使用adb logcat命令查看Android设备的日志,帮助调试Unity应用与SQLite的交互问题。 10. **跨平台兼容性** 虽然我们在这里讨论的是Android...

    php的十个高级技巧

    1. **异常处理**:利用try-catch语句捕获异常,并给出合理的响应,避免程序崩溃。 2. **错误日志**:将错误信息记录到日志文件中,方便后续分析和调试。 3. **自定义错误处理器**:设置自定义的错误处理器函数,以便...

    ActionScript3.0帮助

    8. **本地存储**:LocalConnection和SharedObject的使用,允许在本地存储数据或实现不同SWF文件间的通信。 9. **错误处理**:异常处理机制,如try-catch语句,用于捕获和处理运行时错误。 10. **ActionScript3.0库...

    PHP的十个高级技巧 (上,中,下).docx

    在这些平台上,推荐使用DSO(Dynamic Shared Object)方式安装PHP,因为它便于管理和升级。 **DSO安装PHP的步骤:** 1. **获取Apache源码**:从Apache软件基金会的官方网站下载最新版本的Apache源代码。 2. **解压...

    VB 稳定多线程示例源码

    SyncLock sharedObject ' 在这里执行需要同步的代码 End SyncLock ``` 此外,为了确保线程安全,还需要关注线程间通信。WaitOne、Signal、Join等方法可以帮助我们控制线程的执行顺序,防止死锁和竞态条件的发生。 ...

    ffmpegandroid封装接入so库直接用

    在Android平台上,为了实现对FFmpeg的功能利用,通常需要通过NDK(Native Development Kit)进行本地化调用,即封装为SO(Shared Object)库,以便在Java层直接使用。本文将详细介绍如何在Android应用中接入并使用...

    C++编程思想

    - 如何正确抛出和捕获异常。 5. **性能优化**: - 高效的数据结构选择。 - 缓存(Caching)和缓存一致性问题。 - 性能瓶颈分析工具的使用。 6. **并发编程**: - 多线程(Thread)基础。 - 同步机制,如互斥锁...

    flex编写的,开心农场案例

    - **本地存储**:使用Flex提供的LocalConnection或SharedObject,可以将用户的游戏进度、资源存储在本地,保证用户离开游戏后能继续。 - **服务器交互**:若需要实现多用户交互,如好友系统、市场交易,需与服务器...

    杭州电子科技大学C++面向对象程序设计_期末考试试题(A)卷.zip

    试题可能涉及如何抛出和捕获异常,以及异常安全性的考虑。 7. **输入/输出流**:C++标准库提供了iostream库,用于实现高效的数据输入输出。试题可能考察如何使用cin、cout进行基本输入输出,以及fstream库进行文件...

    面向对象程序设计实验C++版

    实验将涵盖try-catch语句块,理解何时和如何抛出和捕获异常。 8. 输入/输出流(I/O Streams):C++的I/O库提供了标准输入输出操作,如cin和cout,用于读写用户输入和屏幕输出。实验将介绍基本的文件输入输出操作,...

    安卓so库动态加载示例.zip

    在安卓应用开发中,SO(Shared Object)库是C或C++编译的动态链接库,用于提供原生代码支持,提升性能或者实现特定功能,比如图像处理、加密算法等。"安卓so库动态加载示例.zip" 提供了一个关于如何在Android应用...

    Action script AS3 中文帮助手册

    11. **本地存储**:使用`SharedObject`可以存储用户数据在本地,实现数据持久化。 12. **调试和性能优化**:学习使用Flash Professional或独立的AS3调试器来查找和修复问题,以及如何编写高效的代码以提高性能。 ...

    高级C++语言程序设计技巧与实例

    了解何时抛出异常、如何捕获异常以及异常安全编程原则至关重要。 4. **命名空间(Namespace)**:命名空间用于避免全局作用域中的名字冲突,使得大型项目中的代码组织更加有序。正确使用命名空间能有效管理代码的可见...

    ActionScript3.0开发技术大全(光盘源码)第三部分

    10. **本地存储与共享对象**:AS3允许在用户的本地存储数据,源码可能涉及到SharedObject的使用,用于保存用户设置或游戏进度。 通过这些章节的学习和源码实践,读者不仅能够理解ActionScript3.0的基础语法,还能...

Global site tag (gtag.js) - Google Analytics