今天我终于升级了twitter客户端软件Twitter Air。相对于上一版本,V0.3加入了search user, follow user, unfollow user, change profile image等功能。虽然还没有支持direct message,但是这些功能已经基本满足日常需求了。
Twitter Air基于Adobe AIR技术构建,客户端需要安装Adobe AIR2 beta1,而目前AIR的正式版本为1.5,所以使用该软件时需要先手动安装Adobe AIR2 beta1,而安装了Adobe AIR2 beta2的用户可能需要先卸载AIR再安装Adobe AIR2 beta1。在这方面,我也十分恼火,希望Adobe尽快放出AIR2的正式版。
首先,苦于没有twitter账号朋友可以从这里进行注册:http://twitese.darkices.com/。
由于某些原因,目前国内无法直接访问twitter.com的REST API,所以Twitter Air使用了API Proxy来获取和更新数据。目前使用的API proxy是本人空间的一个地址:????(已移除) 我并不保证这个地址永久可用,所以在软件不能使用的情况下可以搜索其它可用的API Proxy。
当然,如果你拥有一个国外的PHP空间,也可以搭建自己的API Proxy,具体方法请参考:http://code.google.com/p/tweetr/
最后要感谢一些开源框架的作者,没有他们的杰出贡献,Twitter Air也不能这么顺利的完成:
Robotlegs是一个纯ActionScript(指不依赖Flex框架中的代码或特性)写成的MVC微型架构。它简单易用,为应用程序的设计提供一个清晰的层次结构,并且它的DI(Dependency Inject)特性容易让人对这个迷人的框架产生“依赖”。
tweetr是一个twitter api的library, 它既包括一个AS3的API, 还包括一个PHP的API proxy,更新一条tweet,follow一个user都靠它们来实现了。
kingnarestyle是一套Flex skin, 这套黑色皮肤是十分受本人喜爱的,这里“严重”声明一下。
用于Flash平台的开源事件模型as3signals目前在开源社区逐步升温,我在之前的一篇Blog中也略有提到了它诞生的历史原因。如今,许多著名的Flash框架开始与as3signals联姻,这里是它们的一些结合体:
跟EventDispathcer相比,as3signals有更易用的接口,如add, remove, dispatch。并且它还有一些EventDispatcher没有的接口,如addOnce, removeAll。
下面看看如何使用as3signals来触发和监听事件:
public class Dispatcher{
public var signal:Signal;
public function Dispatcher(){
signal=new Signal();
}
}
var dispatcher:Dispatcher=new Dispatcher();
dispatcher.signal.add(signalHandler);
function signalHandler():void{
trace("signal dispatched");
}
dispatcher.signal.dispatch();
ISignal.dispatch()支持可变参数,这意味着通信时可以传递任意数量的对象。Signal的构造函数可以指定dispatch传输的数据类型,这利于在编译期间找出潜在bug。
public class Dispatcher{
public var signal:Signal;
public function Dispatcher(){
signal=new Signal(String,String);
}
}
var dispatcher:Dispatcher=new Dispatcher();
dispatcher.signal.add(signalHandler);
function signalHandler(p:String,q:String):void{
trace("signal dispatched");
}
dispatcher.signal.dispatch("cool","as3Signals");
DeluxeSignal支持事件监听器的优先级以及事件的冒泡。addOnce监听的事件只会执行一次,这将为我们提供很大的便利。
var deluxeSignal:DeluxeSignal = new DeluxeSignal(this);
deluxeSignal.addOnce(deluxeSignalHandler);
deluxeSignal.dispatch(new GenericEvent());
deluxeSignal.dispatch(new GenericEvent());
function deluxeSignalHandler(event:GenericEvent):void {
trace("deluxeSignal dispatched: ",event.target);
}
NativeSignal用于结合EventDispatcher,这样原本有EventDispatcher发出的事件转交给了Signal。
var nativeSignal:NativeSignal = new NativeSignal(stage, MouseEvent.CLICK, MouseEvent);
nativeSignal.add(nativeMouseHandler);
function nativeMouseHandler(event:MouseEvent):void {
trace("nativeMouseHandler: stage clicked");
}
除了易用的接口之外,它在性能上也表现不凡:http://alecmce.com/as3/events-and-signals-performance-tests。