作者:hunhun1981
出自:http://blog.csdn.net/hunhun1981/
基于事件触发模型进行编程可以在有限程度内增加程序的灵活性以及可扩展性,它可以将对具体代码的依赖,延迟到触发时再实现。
可惜,在j2me环境下,无法使用委托等语法。更没有它自己的事件系统。
曾经看到许许多多的资料,说到j2me的事件处理时,都只是在介绍Command以及CommandListener,并不是下面我要介绍的简易事件框架……
其实大家可以先参考CommandListener的接口,任何实现了该接口的类,都可以通过一个Displayable的子类对象的引用,调用到这个方法。
例如:
public class test implements CommandListener {
public void commandAction(Command c, Displayable d) {
…
}
}
使用的时候,需要使用”Displayable.setCommandListener(test);”,这样由Displayable触发的Command事件,将由test的commandAction进行处理。
下面介绍我的Event模型。
先看看源码:
/**
*
* @author hunhun1981
*/
import java.util.Vector;
public class HEvent {
private static Vector listeners = new Vector();
public interface HEventListener {
public void eventAction( int eventListenerHandle, int eventType,
Object param);
}
/**
* return event listener handle
*/
public static int setHEventListener(HEventListener listener) {
listeners.addElement(listener);
return (listeners.size());
}
public static Vector setNewGroup( int [] listenerIndexs) {
Vector newGroup = new Vector();
for ( int i = 0 ; i < listenerIndexs.length; i ++ ) {
newGroup.addElement( new Integer(listenerIndexs[i]));
}
return newGroup;
}
public static void publish( int eventListenerHandle, int eventType,
Object param) {
if (eventListenerHandle > 0 && eventListenerHandle <= listeners.size()) {
((HEventListener) listeners.elementAt(eventListenerHandle - 1 ))
.eventAction(eventListenerHandle, eventType, param);
} else {
throw new IndexOutOfBoundsException();
}
}
public static void publish(Vector group, int eventType, Object param) {
for ( int i = 0 ; i < group.size(); i ++ ) {
publish(((Integer) group.elementAt(i)).intValue(), eventType, param);
}
}
}
简单吧,使用的时候需要注意一下几点:
监听者需要继承并实现HEventListener接口,发布者需要注册一个发布ID(eventListenerHandle),并且定义Event的种类(eventType)。
这个模型没有复杂的调用和查询过程,全都是按索引实现的,所以并不影响效率,可以放心使用,当然代价就是需要遵循使用的规范。
具体描述就不说了,写点示范,感兴趣的朋友自己看看吧。
示例代码如下:
public class publisher {
public static final int EVENT_1 = 1;
public static final int EVENT_2 = 1;
private int eventListenerHandle;
public publisher(int eventListenerHandle) {
this.eventListenerHandle = eventListenerHandle;
}
public void fun1() {
HEvent.publish(eventListenerHandle, EVENT_1, null);
}
public void fun2() {
Object param = new Object();
HEvent.publish(eventListenerHandle, EVENT_2, param);
}
}
public class eventListener implements HEventListener {
public void eventAction(int eventListenerHandle, int eventType,
Object param) {
…
}
}
此外,还有一些要点。
1,这个事件处理是可以传递参数的,这样用起来更方便。
2,eventAction函数中的eventListenerHandle参数主要用于一个listener对应多个publisher的情况,各个publisher都有自己的eventListenerHandle。
3,publisher跟listener一对一的情况比较简单,如果是一个publisher多个listener,则可以使用组发布模式,看看setNewGroup函数和publish的另一个重载就明白了,请小心,它是顺序执行的。
一般情况下,我都是使用一对一的模式,细心的朋友可能发现eventListenerHandle也可以定义在publisher以外的地方,其实,完全是自己在管理,反正发布的时候给个ID就可以了。
最后说一句,有事件处理还是很爽的:)
更多信息,请关注hunhun1981的专栏 。