我有一个名为socket.as的类,负责套接字连接等。它有一个事件监听器onSocketData,只要收到数据就会调用它。在我的主类Main.as中,我实例化了一个socket类的对象。
如何从套接字类中获取 数据 ?我是否必须在Main.as中创建一个应该由套接字类触发的自定义事件? 谢谢。
下面是套接字类的事件监听器:
private function onSocketData(event:ProgressEvent):void <br>
{
//string sent over serial port.
var data:String = _socket.readUTFBytes( _socket.bytesAvailable );
var direction:int = 0;
buffer += data;
while((index = buffer.indexOf(EOL_DELIMITER)) > -1)
{
msg = buffer.substring(0, index-1);
len = (buffer.indexOf(EOL_DELIMITER)) - 1;
//remove the message from the buffer
buffer = buffer.substring(index + 1);
if ( msg != "off" )
{
button = parseInt(msg.substr(6, (len-8)));
trace("Socket Data: " + msg + ", Button: " + button);
}
}
}
答案 0 :(得分:1)
正如您所提到的,您可以创建一个将由Socket类触发的CustomEvent,或者您可以在Socket类中调度Event,只要数据可用并使用getter来检索变量。
我在这里回答了类似的问题:
AS3 Passing data between objects/classes
答案 1 :(得分:1)
好吧,如果您只想获取数据,可以将其存储在类中的数组中,然后使用一种方法将其删除。
相反,如果您想将事件推送到Main.as,则需要创建自定义事件。
最简单的方法是从EventDispatcher
派生您的课程。
然后,当您要触发某个事件时,只需致电super.dispatchEvent(new CustomEvent(payload))
,其中CustomEvent
是您Event
派生的一类。
一般模式如下:
创建一个自定义事件...除非现有的事件类有意义......然后只重用其他东西。
public class SocketEvent extends Event {
public var payload:String;
public function SocketEvent(payload:String, bubbles:Boolean=false, cancelable:Boolean=false) {
super(Socket.EVENT_NAME, bubbles, cancelable);
this.payload = payload;
}
}
然后,触发事件的类看起来像这样:
public class Socket extends EventDispatcher {
public static const EVENT_NAME:String = "EVENT_NAME";
private function fireTheEvent(payload:String):void {
dispatchEvent(new SocketEvent(payload));
}
}
最后,要在Main.as中使用它,你会这样做:
private var socket:Socket = new Socket();
socket.addEventListener(Socket.EVENT_NAME, actionHandler);
请注意,这不是触发事件的唯一方法。另一种方法是根据静态EventDispatcher方法实现IEventDispatcher
......但这是一个不同的例子。