在Air中TextInput输入汉字或日文会引发死机
环境Flex3正式版,Air1.01
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:TextInput />
</mx:WindowedApplication>
Bug重现步骤:
1 随便写一个TextInput,或者TextArea,运行程序。
2 在输入框中使用微软智能拼音,Google拼音(我只试过这两个输入法)快速的不停的输入,乱敲键盘即可(按几下字母按一下空格这样不停的按) ,坚持3秒左右,死机Yeah!
王码五笔86版没有测出问题。
日文测试:在输入框中输入hi,按空格选择第2个汉字”日”或”非”,但不要Enter输入,这时按k,死机Yeah!
讨论死机的其它链接:
中文:http://www.riachina.com/showtopic.aspx?forumid=6&topicid=9352&go=next
日文:http://www.fxug.net/modules/xhnewbb/viewtopic.php?viewmode=flat&order=DESC&topic_id=1628&forum=14
解决办法是在这里找到的
http://millay.net/code/archives/001054.php
把AIR Application Descriptor File里的transparent设为true就不会死机了,但不清楚为什么。
<initialWindow>
<systemChrome>none</systemChrome>
<transparent>false</transparent>
</initialWindow>
Air在多语言支持方面急需加强,否则会影响全球范围的普及。
例如mx:HTML组件,据说使用的浏览器核心是Webkit,不支持中文,日文等,就是说如果用mx:HTML来显示一个html,如果有一个输入框我们只能输入字母,不能输入汉字,这还不够影响你使用Air么。
我的解决办法是用TextInput来模拟输入:
当用户点击HTML里的输入框时,Javascript把焦点转移到Air的一个TextInput中,这时你输入文字是可以的,TextInput添加一个Event.change的Listener,用ActionScript把输入到TextInput的值Copy到Html中的输入框中。
虽然解决是解决了,但让用户看起来很怪。
PureMVC中文文档发布了!
PureMVC官方网站: http://www.puremvc.org/
Cairngorm是Adobe官方提供的一个框架,不过相信看过的人都会头大,我认为Cairngorm企业级并且是大型程序开发,小型程序开发使用它并不合适.
具体比较先略过,这里先说一下文档.Cairngorm的文档已经有人翻译为中文了,给大家阅读提供了便利.但发现PureMVC没有人怎么关注,只有个什么十大注意点之类的.可能是因为官方提供了Cairngorm,所以其它的框架被关注就少了吧.
不过PureMVC比Cairngorm要灵活的多,如果你开发的是中小型程序,那么PureMVC要更适合一些,当然我没有说大型程序不能用啊.
经过一星期晚上业余时间的努力,终于译完了,点击下面链接下载.
PureMVC_Implementation_Idioms_and_Best_Practices(zh-cn).pdf
PS: 欢迎和我Mail交流啊。
在网上很流行一种说法,读取文本文件的前三个字节来判断文件的编码。其实这种方法不可取,前三个字节是Unicode编码的Byte Order Mark (BOM),
BOM参考: http://www.unicode.org/faq/utf_bom.html#BOM
BOM对于Unicode编码是可有可无的,只是用记事本编辑另存为Unicode,UTF-8时会在文件流前加上BOM,但如果是程序写文件,比如用Java的IO流,Flex的IO等就不一定会加上BOM,Flex写Utf-8文件是不会加BOM的,Java的虽然没有试过,但多半也不会加。
那到底怎么判断文件编码呢,参考下面的文章:
http://blog.i5un.com/item/21
可以在Mozilla 的代码树中查看最新实现: http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet/src/
或者搜索关键字:一种语言/编码检测的复合方法
这是一个方法的实现:
http://dev.csdn.net/article/10/10961.shtm
发现EmEditor编码检测就做的很好,可是不是开源的。
在Java里,你可以使用static块在加载类的时候给static变量赋值,但是在AS里没有static块语句。
所以如何在加载类的时候确保你的static变量已经被赋值呢,有两种方法。
这里指的赋值是指一系列复杂的语句,不是单纯的一个字符串赋值或new一个对象。
方法一:使用[Mixin]标签
在类定义前加[Mixin]标签,添加一个static init function像一面这样:
static init funciton会在加载类时被执行。
[Mixin]
public class Model{
public static function init (systemManager : ISystemManager){
trace (”I get called first”)
}
}
方法二:在类体中的代码在加载类时会被执行。
public class Model{
trace('I get called first');
init();
public static function init() : void {
// somethins
trace('I get called first too.');
}
trace("class loaded")
}
参考:
http://flexonrails.net/?p=78
http://flexonrails.net/?p=66
http://livedocs.adobe.com/
译自Adobe Help Resource Center
1 安装Adobe AIR 运行时,和java的JVM类似。
Adobe AIR 运行时允许在桌面运行AIR应用程序,脱离游览器的束缚。
下载安装文件http://labs.adobe.com/downloads/air.html
在下载页面有样例程序(Sample Applications)http://labs.adobe.com/technologies/air/samples/
2 安装开发环境
当然我们选择开发效率最高的Flex Builder,此外还有命令行编译的一套工具。
http://labs.adobe.com/technologies/flex/flexbuilder3/下载文件需要在Adobe注册用户。
3 Adobe AIR简介
Adobe® AIR™ 是一个跨平台的运行时,可以使用现有的Web开发技能(Flash, Flex, HTML, JavaScript, Ajax)创建桌面富因特网应用程序。
AIR程序运行基于Adobe AIR Runtime,所以开发的程序在不同的操作系统表现是相同的,就像Java一样。
AIR 允许你使用最熟悉的开发环境,选取你最擅长的工具进行开发。比如
- Flash / Flex / ActionScript
- HTML / JavaScript / CSS / Ajax
所以AIR应用程序可以
- 基于Flash或者Flex,即应用程序的容器是Flash或Flex(swf)
- 基于包含HTML或PDF的Flash或Flex,即应用程序的容器是Flash/Flex,内含HTML或PDF
- 基于HTML,应用程序的容器是HTML,JS,CSS
- 基于包含FLASH/FLEX或PDF的HTML,即容器是HTML,内含FLASH/FLEX,PDF。
4 使用Flex Builder创建第一个Flex AIR应用程序
我们将创建一个基于SWF文件的AIR应用程序,打开Flex Builder3,当然Flex Builder基于Eclipse,实际上它是一个Eclipse的插件。
新建一个Flex Project类型的工程。Flex有两种应用程序类型,一种基于Web在Flash player里运行,一种在桌面运行于Adobe AIR runtime,我们选择桌面应用程序。服务器技术选择none,点击完成。
初始生成两个文件:mxml主文件和xml程序配置文件。
5 编写AIR应用程序
所有的代码都包含在WindowedApplication 标签内,这个标签创建了一个简单的窗口。
以代码视图打开mxml文件进行编辑,给WindowedApplication 标签添加一个title属性,值设定为”Hello world!”
在WindowedApplication元素内添加一个Label组件。
在WindowedApplication开始标签后紧跟着插入Style块,最后代码是这样的:
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute" title="Hello World">
<mx:Style>
Application
{
background-image:"";
background-color:"";
background-alpha:"0.5";
}
</mx:Style>
<mx:Label text="Hello AIR" horizontalCenter="0" verticalCenter="0"/>
</mx:WindowedApplication>
选择Adobe AIR Application方式运行。
6 打包应用程序
把应用程序打包成AIR文件发行,AIR文件是包含所有应用程序文件的一个压缩文件,用户可以用AIR文件安装应用程序。
首先确保没有编译错误并运行正常,然后选择导出–Flex Release Version.
导出提示会需要一个数字签名,创建一个,填写必须的信息OK,成功,双击导出的AIR文件安装,测试一下。
1 输出一个int值到网络流
有一回需要把一个int值输出到网络流,然后在另一客户端接收这个int值,当然网络传输用的是byte型,所以查找好多资料把int转成四位的byte数组,然后用write(byte[] b)写到流中,到另一端接收四位的byte数组,然后转换回来,很是麻烦。
现在才知道有现成的可以用,java.io.DataOutputStream 提供将一个 int 值以 4-byte 值形式写入基础输出流中的方法writeInt(int v)。
然后有一个现在的java.io.DataInputStream类,用readInt()方法读取输出流写入的int值。
2 缓冲流
如果你需要一个缓冲输出流,而不是DataOutputStream,那么可以这样写:
DataOutputStream dout = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(”data.txt”)));
这样输出流仍然是BufferedOutputStream。
3 write(int b)
write(int b)是一个容易误会的方法,这个方法只是把b的低八位写到输出流中。所以超过0-255的值将会忽略高位的值,相当于把int值截取成一个byte值。
4 输出字节数
每次输出一个字节是非常低效的策略。
5 out.flush()
关闭流之前要调用flush()方法,当然在需要的时候也要调用flush()以避免阻塞。
6
read()方法读取一个字节,所以返回的是一个byte值,但类型却是int。取值区间是-128到127,要转换成byte可以这样
int i = b >= 0 ? b : 256 + b;
7 文件编码
如果要读取一个Unicode文本文件,可以尝试读取前三个字节来判断文件是big-endian UCS-2, little-endian UCS-2, 还是 UTF-8,然后决定用什么编码的Reader。
此方法不可取,原因见: 判断文本文件的编码