2011-02-07 18 views
2

我新的Java和我開始學習它在Android平臺上,我知道它不是好的開始在移動平臺上的仿真語言學習,但無論如何....Java「的事件調用外部」

我想問一些關於java的問題,是一些方法的「外部」調用。我的意思是,通常在程序或教程中,你只是使用某種方法,然後根據某些操作自動運行。

這實際上是非常好的,我非常喜歡它,但我想知道這是如何實現的。 JVM是否必須實現這些功能,或者它們是否可以用戶自定義?

對於Android上的axample方法是在相應事件上調用的方法surfaceCreated(),surfaceDestroyed(),您可以處理它。類似的是按鈕點擊處理,以及更多的事件。

我只想知道這是如何實現的,因爲,例如在C中,您必須手動檢查某個動作是否發生。而且你受OS提供的數據限制。那麼,JVM是否具有可以調用的預定義操作,或者您是否可以手動以某種方式告訴它基於某些事情執行某些操作?我知道這是一個奇怪的問題,但實際上對我來說很奇怪,我無法更好地解釋它。也許你可以理解我的不知道,如果你知道我主要爲C編寫了MCU,所以這種行爲對我來說很奇怪。但我喜歡它。

回答

1

這被稱爲事件委託模型。

如果監聽者註冊時發生任何事件,則調用合適的代表。

記住的事情一切都是哎呀在此,將在類條款處理和對象

我們可以從一個很簡單的例子理解這個按鈕點擊的說。

考慮我使這個類

class MyButtonClickListener implements OnClickListener 
{ 
    public void onClick(View v) 
    { 
      //do something on button click 
    } 
} 

現在看到這個類實現一個接口。這個類必須提供接口的空方法來實現它。否則代碼將無法編譯。

這可確保此類的每個對象都具有onClick方法的主體。現在讓我們註冊這個來聽我們的按鈕點擊。

說我的按鈕被button01

button01.setOnClickListener(new MyButtonClickListener()); 

現在考慮對象button01中有某個地方保持一個列表,它具有對象的地址做(在我們的情況下,新MyButtonClickListener())的東西后。

現在佈局管理器以一種事件發生的方式進行編碼(例如按下按鈕),將此事件發送到對象監聽器列表以執行進一步操作。

這將以時尚的方式發生,當點擊按鈕時,然後檢查偵聽器的按鈕列表,如果它被發現不是空的,這意味着有一個偵聽器。現在在列表中找到參考,onClick方法被調用。特別是onClick被調用,因爲我們調用setOnCLickListener來設置偵聽器。如果您將檢查此方法的代碼。你會發現方法正在接收OnClickListener引用。這是一個實現OnClickListener接口的類的對象,因此必須提供一個onClick方法的主體。

並且因此執行該委託。這只是哎呀。我希望我能夠把它解釋得很好。

0

你問兩個不同的東西:

一些方法,你可以重寫,當一些動作發生被稱爲(的onResume(),...)。它們總是被調用(通過運行時/框架),當你的類重寫它們時,你的實現被調用。但代碼中的某處是實際調用此方法的地方。這些被稱爲virtual methods

在您訂閱的按鈕點擊事件是類似的,但那是event-driven programming。當您訂閱一個按鈕單擊事件,例如

foo.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
        ... do stuff 
      } 
} 

foo對象的地方保存OnClickListener到它的內部。當按鈕被點擊時,它會在它的內部看看它是否保存了任何OnClickListeners,如果是的話,它會在它們每一箇中調用onClick()方法。