這幾天做個連連看遊戲,是學校要求的“練手”產品,培訓機構有給相關的資料,但是實在不合我的胃口,爲了節省時間就下了個源碼研究,然後自己去寫寫看。
今天要說的就是,自定義監聽器。
開始的時候,完全搞不明白這到底是個神馬東東,很神祕的感覺,做起來也好麻煩,然後就開始各種找資料看。
最開始就是做完出效果,但是還是不太好理解,多做幾個例子跟着程序走一遍就明白了。
下面是我對監聽器的理解:可以這麼看,監聽嘛,就是監視並報告,假設現在是兩軍對戰,我軍需要監視敵軍的情況,那麼就要在敵軍中安插一個線人(奸細),然後告訴他有什麼情況隨時彙報,我方接到線人的回報後,再做出相應的對策。
現在,做一個簡單的小程序如下。定義一個包含計時器的類(敵),安插線人後計時10s,然後報告給我方,我方接到線人的報告後,退出程序。
1、新建一個安卓應用程序,全部默認就好
2、定義一個接口,叫Spy,這就是間諜。間諜就幹一件事,Listening()。
package com.test.leetlelistener1; public interface Spy { public void Listening(); }
3、定義地方陣營Enemy,並寫一個計時器,一個setSpy(Spy s)方法,用來安插線人。
package com.test.leetlelistener1; /** * 定義被監聽的陣營 * @author LEE * */ public class Enemy { public Spy spy; public int time = 10; Timer timer=new Timer(); public void setSpy(Spy s) { this.spy = s; timer.start(); } /** * 定義計時器 * @author LEE * */ class Timer extends Thread { @Override public void run() { super.run(); while (time >= 0) { time--; try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } spy.Listening(); } } }
4、讓MainActivity implements線人接口。然後定義一個Enemy,並安插線人
package com.test.leetlelistener1; import com.test.leetlelistener1.R; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity implements Spy { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Enemy enemy = new Enemy(); enemy.setSpy(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public void Listening() { System.out.println("MainActivity Listening()"); System.exit(0); } }
5、運行。10s後程序退出。
這是最簡單的自定義監聽的例子,也比較容易理解,MainActivity自己當了間諜,安插到敵方,然後在10s後通知大本營退出程序就over了。
我覺得這個比較神奇的就是,setSpy(MainActivity.this),這個設置的線人不是別的,正是implements了Spy的MainActivity自己,而setSpy(Spy s)的形參就是(Spy spy)。
以前學基礎知識的時候,會有接觸過接口繼承的東西,但是沒這樣子應用過,實踐和理論還是蠻不一樣的哈。
關於Listening()方法,也可以爲其設置參數,比如改成
public void Listening(int time)
可以通過參數傳遞向大本營提供詳細的情報信息。
當然也可以設置很多個監聽方法,用來表示不同的監聽事件。
另外不知道這個是不是觀察者模式的一種應用呢?回去補一下設計模式。
自定義監聽器1到此結束!附上源碼。
2014.12.28