2012-09-26 52 views
2

我已經開發了一個基於PC的API,在C#與嵌入式電子設備進行通信。該API讀取PC COM端口,解碼數據包,構造數據包並引發事件。現在我需要在Android手機中開發相同的API。由於C#和Java事件之間存在差異,我很困惑如何在Java中實現相同的功能。C#中的等效事件

下面的C#代碼上升事件:

public class MARGserial 
{ 

    dataObject = BT_DeconstructPacket(encodedPacket); 
    if (dataObject != null) // if packet successfully deconstructed 
    { 
     OnMARGdataReceived(dataObject); 

     if (dataObject is RawMARGdata) 
     { 
      OnRawMARGdataReceived((RawMARGdata)dataObject); 

      PacketsReadCounter.RawMARGdataPackets++; 
     } 
    } 
    public delegate void onRawMARGdataReceived(object sender, RawMARGdata e); 
    public event onRawMARGdataReceived RawMARGdataReceived; 
    protected virtual void OnRawMARGdataReceived(RawMARGdata e) 
    { 
     if (RawMARGdataReceived != null) 
      RawMARGdataReceived(this, e); 
    } 

}/*End of MARGserial class */ 

下面的代碼是在Windows控制檯應用程序訂閱事件OnRawMARGdataReceived

public static MARG_api.MARGserial MARGserial = new MARG_api.MARGserial("COM44"); 
MARGserial.RawMARGdataReceived += new MARG_api.MARGserial.onRawMARGdataReceived(MARGserial_RawMARGdataReceived); 

static void MARGserial_RawMARGdataReceived(object sender, MARG_api.RawMARGdata e) 
{ 
    Console.WriteLine("Data : " + e.Accelerometer[0].ToString() + " "+e.Accelerometer[1].ToString()+ " "+e.Accelerometer[2].ToString()); 
} 

在Android的Java應用程序,主要活動類本身認購這是另一類線程內觸發的事件(此線程讀取藍牙緩衝&構造的數據包)

+0

事件不是Java中的語言功能。這個答案很好地總結了它:http://stackoverflow.com/a/4763441/14357 – spender

回答

0

我成功研製出可使用谷歌提供的BluetoothChat樣品連接到我的藍牙設備的Android應用程序。設備的藍牙模塊具有來自RovingNetworks (RN-41)的SPP(串行端口配置文件)。

0

如果您的應用程序的情況下,沒有使用像「Swing」那樣的GUI-Toolkit,那麼在Java中,Listener Pattern對於這類任務是非常普遍的。

這就是你有一個監聽器,它在主機上註冊自己,而主機又保存一個監聽器列表。如果發生與偵聽器相對應的事件,那麼偵聽器將得到通知。

它與Observer Pattern非常相似。

也許這個SO question是有幫助的。

+0

它應該是Swing不搖擺。 – gprathour

+0

你是對的,請參閱編輯。 – Fildor

0

你可以在這裏使用設計模式,特別是觀察報:

在觀察你有一個名爲IObserver用的方法稱爲update()方法,你讓你的所有感興趣的對象實現一個接口。然後主對象存儲一組s,並且當發生某事時,它會在該集合中的每個對象(本質上是回調)上調用.update()。這在MVC架構中也很常見,如果您想要這樣做GUI,那麼模型狀態發生變化並且視圖需要更新時也是如此。

您還可以使用Command設計模式實現委託樣式的一階函數,由於沒有對此概念的本機支持,因此在Java中非常有用。

我不確定上述是否有助於您的具體情況,但設計模式通常是解決各種問題的好方法。

+0

您提到了命令模式。 OP可以在這裏找到更多的信息:http://www.oodesign.com/command-pattern.html(fyi) – Fildor