相信大家用flash加载xml后,如果在浏览器里浏览flash,修改了xml,未清缓存,是不会更新的,同理,如果是加载php输出的xml,也是不会更新的,那该如何处理?将路径写成“*.php?id=ramdom(10000)”?发现有时候这样写也不能立刻更新。在偶尔中发现一个很简便的方法,就是开session,session不需要任何内容,只需要在输出xml的php里面,在第一行加一句 session_start(); 就OK了。是不是很简单?这样从后台更新了文件,flash读取数据库内容就会即时更新了!
Category Archives: 技术
AS3和php通信
以为在as3里面和后台通讯也是那么简单的事情,但实践告诉你,还是要遇到很多麻烦,例如不像as2里面loadVars方法已经被废弃,而改用一系列的类来实现与后台数据的交互,这些类是:URLLoader,URLLoaderDataFormat,URLStream,URLVariables。
在使用URLLoaderDataFormat.VARIABLES时报以下错误:
Error: Error #2101: 传递给 URLVariables.decode() 的字符串必须是包含名称/值对的 URL 编码的查询字符串。
1 2 3 4 | at Error$/throwError() at flash.net::URLVariables/decode() at flash.net::URLVariables$iinit() at flash.net::URLLoader/flash.net:URLLoader::onComplete() |
出现些错误其实在于php里的第一行echo输出的信息中是否包含了url参数方式的;
以下的方式是正确的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | $flashData = $_POST['message']; $phpMessage = 'im php message!'; echo "phpMessage=$phpMessage&flashMessage=$flashData"; ?> 或 <?php $flashData = $_POST['message']; $phpMessage = 'im php message!'; echo "phpMessage=$phpMessage&flashMessage=$flashData"; echo "其他信息"; ?> 以下方式就会报错: <?php $flashData = $_POST['message']; $phpMessage = 'im php message!'; echo "sfsdfghfghfghfghgfhsf"; //不是url参数形式即不是 变量名=值 然后用 & 连接的格式; ?> 或 <?php $flashData = $_POST['message']; $phpMessage = 'im php message!'; echo "klsdfjlsdkfjlksdjflkjsdf"; //这是第一个echo, flash找不到匹配的 url参数形式的字符串; echo "phpMessage=$phpMessage&flashMessage=$flashData"; |
这个echo就需要写的很规范了,不能像as2时代乱来了。不过一般时候,还是可以用2进制来监控,只要加载完毕就OK。
AS3.0中的异步异常处理捕捉
如果程序有错误的时候,老是会跳出一个提示框出来,这个在as2.0时代是没有的,错了就错了,管你是老几,就不告诉你哪里错,让你憋死。
As3.0一开始很不习惯,怎么老是错啊,错来错去找来找去,都是一些很常见的错误,而且要写的很长才能处理掉。不过久而久之就习惯了,这样的错误处理可以提高自己的编程能力。后来才知道异常错误捕捉是很好用的,只要知道什么地方可能出现错误,用try语句然后catch那个错误,就可以了。
1 2 3 4 5 6 7 | var xmlLoader:URLLoader = new URLLoader(); try{ xmlLoader.load(new URLRequest("data.xml")); } catch{ trace("出错啦~~~") } |
但上面这个是捕捉不到的。需要高级一点。帮助文档中:
处理错误 > 错误类型
异步错误,这类错误是在应用程序运行期间在不同点处发生的运行时错误,它们会产生相应事件并由事件侦听器捕获。在异步操作中,函数发起操作但并不等待操作完成。
由于事件处理是异步的(即不是在特定、已知或预先指定的时间发生),因此需要使用 addEventListener() 方法来侦听这些特定的事件
估计得加监听特别处理了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | try { var re:URLRequest = new URLRequest("data.xml") var xmlLoader:URLLoader = new URLLoader(); xmlLoader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); xmlLoader.load(re); } catch (err:IOErrorEvent) { trace("出错啦~~~"); } function ioErrorHandler(e:IOErrorEvent) { trace("Error"); } |