繁体   English   中英

Java中的C#等效事件

[英]C# Equivalent events in Java

我已经用C#开发了一个基于PC的API,可以与嵌入式电子设备进行通信。 该API读取PC COM端口,解码数据包,构造数据包并引发事件。 现在,我需要在Android移动版中开发相同的API。 由于C#和Java事件之间存在差异,因此我很困惑如何在Java中实现相同目标。

以下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控制台应用程序中的Event 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应用程序,则应用程序本身中的Main Activity类必须订阅在另一个类线程内部触发的事件(此线程读取Bluetooth缓冲区并构造数据包)

如果您没有使用“ Swing”之类的GUI工具包,则在Java中,侦听器模式对于此类任务非常普遍。

也就是说,您有一个侦听器,该侦听器将自己注册到主机,而主机又包含一个侦听器列表。 如果发生与侦听器相对应的事件,则将通知侦听器。

它与观察者模式非常相似。

也许这个问题是有帮助的。

您可以在这里使用设计模式,尤其是观察者:

在Observer中,有一个名为IObserver的接口,带有一个名为update()的方法,您可以使所有感兴趣的对象实现。 然后,主对象存储一组s,并且在发生某些情况时,它将对该集合中的每个对象(本质上是回调)调用.update()。 如果您希望以这种方式使用GUI(当模型状态更改并且需要更新视图时),这在MVC架构中也很常见。

您还可以使用Command设计模式来实现Delegate风格的一阶函数,这在Java中非常有用,因为它对此概念没有本地支持。

我不确定以上内容是否对您的特定情况有所帮助,但是设计模式通常是解决各种问题的好方法。

我成功开发了android应用程序,可以使用Google提供的BluetoothChat示例连接到我的蓝牙设备。 设备的蓝牙模块具有来自RovingNetworks(RN-41)的 SPP(串行端口配置文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM