基於事件觸發模型進行編程可以在有限程度內增加程序的靈活性以及可擴展性,它可以將對具體代碼的依賴,延遲到觸發時再實現。
可惜,在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模型。
先看看源碼:
package hlib;
/**
*
* @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));
}
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就可以了。
最後說一句,有事件處理還是很爽的:)