2009-09-25 79 views
10

我有一個名爲CommunicationManager的類,它負責與服務器通信。如何在Java中實現回調

它包括方法login()onLoginResponse()。在用戶登錄的情況下,方法login()必須被調用,並且當服務器響應時,方法onLoginResponse()被執行。

我想要做的是將操作與用戶界面綁定。在GUI類中,我創建了一個名爲mCommunicationManager的CommunicationManager實例。從GUI類login()方法是簡單地由線

mCommunicationManager.login(); 

我不知道該怎麼辦,從GUI類中的方法是結合onLoginResponse()調用。例如,如果GUI類包含顯示從服務器收到的消息的方法notifyUser()

我真的很感激,如果任何人都可以展示如何綁定,以執行從當類mCommunicationManager的實例從服務器並執行CommunicationManager.onLoginResponse()方法接收消息GUI類(前。GUI.notifyUser())的方法的方法。

謝謝!

+0

爲什麼沒有人會說http調用這個回調函數涉及swing? – gumuruh 2014-04-14 08:02:43

+0

來自新手的問題。爲什麼你可以做System.out.print(mCommunicationManager.login()); (假設,從服務器打印消息是任務)?我理解多線程模型中的用例,但不能在多線程模型中可視化登錄場景。 – user3388324 2014-06-22 20:32:45

回答

25

這裏有兩種模式,我可以看到你使用。一個是Pete提到的publish/subscribe or observer pattern。我認爲這可能是你想要的,但是當問題提到綁定一個方法供以後執行時,我想我應該提及Command pattern

命令模式基本上是解決方法,因爲java不會將方法(函數)視爲第一類對象,因此不可能將它們傳遞給它。相反,您創建一個可以傳遞的接口並封裝有關如何調用原始方法的必要信息。

因此,對於你的例子:

interface Command { 
    public void execute(); 
} 

,然後你通過這個命令的情況下,當你執行login()功能(未經測試,我總是忘了怎麼去匿名類右):

final GUI target = this; 
command = new Command() { 
    @Override 
    public void execute() { 
     target.notifyUser(); 
    } 
}; 
mCommunicationManager.login(command); 

而在登錄()函數(管理器保存參照命令):

public void login() { 
    command.execute(); 
} 

編輯: 我應該提到,雖然這是它如何工作的一般解釋,但在Java中已經有一些管道爲此目的,即ActionListener和相關類(actionPerformed()基本上是Command中的​​)。這些大部分旨在與AWT和/或Swing類一起使用,因此具有特定於該用例的功能。

3

在Java中用來實現回調行爲成語是聽衆。用你想要的事件的方法構造一個接口,有一個機制來爲事件的來源註冊監聽器對象。發生事件時,請在每個註冊的偵聽器上調用相應的方法。這是AWT和Swing事件的常見模式;對於隨機選擇的示例請參見FocusListener和對應的FocusEvent對象。

請注意,Java AWT和Swing中的所有事件最終都從EventObject繼承,並且約定是調用偵聽器SomethingListener和事件SomethingEvent。儘管您可以隨心所欲地命名代碼,但維護平臺慣例的代碼更容易。