j2me经验总结之事件处理(绝非Command事件)


作者: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模型。
先看看源码:

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[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的专栏

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值