现在说一下自定义监听器的第二种方法。


1、新建应用程序

2、定义接口Spy,同上一篇。

packagecom.test.leetlelistener2;publicinterfaceSpy{publicvoidListening();}

3、定义类Enemy

packagecom.test.leetlelistener2;publicclassEnemy{publicSpyspy;publicinttime=10;Timertimer=newTimer();publicvoidsetSpy(Spys){this.spy=s;timer.start();}/***定义计时器*@authorLEE**/classTimerextendsThread{@Overridepublicvoidrun(){super.run();while(time>=0){time--;try{Thread.sleep(500);}catch(InterruptedExceptione){e.printStackTrace();}}spy.Listening();}}}

4、定义监听类Leader,它代替上一中方法的MainActivity实现接口Spy

packagecom.test.leetlelistener2;publicclassLeaderimplementsSpy{@OverridepublicvoidListening(){System.out.println("SpyClassListening()");}}

5、MainActivity

packagecom.test.leetlelistener2;importandroid.os.Bundle;importandroid.app.Activity;importandroid.view.Menu;publicclassMainActivityextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Enemyenemy=newEnemy();enemy.setSpy(newLeader());}@OverridepublicbooleanonCreateOptionsMenu(Menumenu){getMenuInflater().inflate(R.menu.main,menu);returntrue;}}

6、运行,10s后Logcat可以查看到有

SpyClassListening()

的输出,这个我没有写关闭程序的处理,主要就是看下使用其他的类实现Spy接口的效果。


那么,两个例子一对比,就可以看出来自定义监听需要注意的点有哪些了。

下面做个小结:

1、要监听什么事件?(接口Spy及其方法,此例中要监听的事件是10s计时结束)

2、被监听的对象是谁?(Enemy,会发生要被监听的事件--10s)

3、谁是监听事件的接受者?即监听事件发生后要向谁报告?(implements Spy的类,本文中的Leader,上一篇文中的MainActivity)

4、何时何处设置监听器?(这个视情况而定,因为只是示例一下,所以我都是直接在程序开始的时候就设置了监听和启动计时器等操作,在实际的编程过程中,不管是设置监听还是监听到事件后通知给监听者,一般都有条件/触发事件的。另外,有的时候监听是需要传递一些参数的,这个时候可以通过给接口Spy中的方法设置参数来实现这样的操作。另外,还有一种类似状态这样的监听,我们可能需要用字符串或者某个数字表示某一种特定的情况或者状态。比如,在连连看中,当游戏的状态发生了变化,需要监听器传递一个参数表示游戏状态为——赢了、超时等,我们可能会将这两个状态分别定义为1和2.1表示赢了,2表示超时,但是这样做的话,后期的修改会比较困难,比如我要加一个状态,未超时但无路可走的情况,这样就要加一个3,加一个还好,如果还有其他的,再去修改就比较费心。后来我的处理方式就是在Spy接口中定义一些静态变量表示游戏的状态,每次只要按照变量名的语义设置就可以了,而且修改也会方便很多。可能这样处理会比较笨吧?但是,也算是解决了一部分问题,至少如果我半年后再读或者修改我写的这段代码,不会太困难。)

像下面这样:

packagecom.test.leetlelistener2;publicinterfaceSpy{publicstaticintGAME_WIN=1;publicstaticintGAME_OVERTIME=2;publicstaticintGAME_DIE=3;publicvoidListening(intgameStatus);}

把之前的代码中,Listening的定义和调用加一下参数就可以了。

自定义监听器1到此结束!附上源码。

2014.12.30


附件:http://down.51cto.com/data/2365250