可以从具有多个函数的EventListener中实现一个函数吗?

时间:2013-06-18 02:30:18

标签: java sensor android-sensors event-listener

我正在开发一款应用程序来连接基于蓝牙的多传感器(SensorDrone)。它总共包含大约15个传感器,所有这些传感器都可以使用芯片制造商创建的第三方闭源库与Android设备进行通信。

第三方库要求我实现一个自定义Java EventListener,它包含每个传感器的函数,当它的数据准备就绪时会被触发:

DroneEventListener droneEventListener = new DroneEventListener() {

    @Override
    public void temperatureMeasured(EventObject arg0) {
        readTemperatureFromDrone();
    }

    @Override
    public void pressureMeasured(EventObject arg0) { /*...*/ }

// Etc...

    @Override
    public void disconnectEvent(EventObject arg0) {
        // Let the user know the bluetooth connection was lost
    }

    @Override
    public void connectEvent(EventObject arg0) {
        // Let the user know the device was connected
    }


};

但是,我希望与另一个名为funf的库合作,以获取Android内置传感器的信息。该库非常适合收集内置Android传感器和外部传感器的数据。它通过允许您创建自定义“Probe”实现来实现此目的。但是,探针(通过库和惯例的建议)一次只能用于一个传感器。

原始问题:

所以,我的问题是这个;有可能以某种方式将DroneEventListener()类细分为特定的传感器吗?之后,我可以轻松地为多传感器上的每个传感器创建自定义探头。

我意识到尝试细分抽象类可能是不好的做法,因为它在概念上是开发人员的合同。但是,我认为让这个代码与预先存在的,可靠且维护良好的库(funf)一起工作的温和破解是值得的。

或者,有没有其他创意解决方案可以让我使用制造商的库与funf?

编辑(2013年6月24日):

我已经决定使用“细分”这个词语对我来说很清楚。我本质上意味着当我使用的只有一个时,我不想实现20个空白的方法。所选答案精确地解释了如何做到这一点。

精炼问题:

是否可以从EventListener(具有多个函数)实现一个函数而不必实现混乱的空方法?

3 个答案:

答案 0 :(得分:2)

您无法拆分DroneEventListener,但您可以将其事件处理委派给每个传感器的不同对象。

class SplittingListener implements Drone.DroneEventListener {
    public void adcMeasured(java.util.EventObject event) {
        adcProbe.heyAThingHappened(event);
    }
    public void altitudeMeasured(java.util.EventObject event) {
        altitudeProbe.itsYourProblemNow(event);
    }
    public void capacitanceMeasured(java.util.EventObject event) {
        capacitanceProbe.passTheBuck(event);
    }

    // ...
}

答案 1 :(得分:2)

如果只想使用一种方法来处理每个事件,可以创建一个处理重定向的抽象类。

这样,您只需实现此方法即可处理所有内容。

public abstract DroneEventAdapter implements DroneEventListener {
    public abstract void eventOccured(EventObject event);

    @Override
    public void temperatureMeasured(EventObject event) {
        eventOccured(event);
    }

    @Override
    public void pressureMeasured(EventObject event) {
        eventOccured(event);
    }

    @Override
    public void disconnectEvent(EventObject event) {
        eventOccured(event);
    }

    @Override
    public void connectEvent(EventObject event) {
        eventOccured(event);
    }

    // Etc.
}

如果您需要的只是实现某些事件而没有其他所有事件的空存根,您可以使用空方法创建一个实现每个事件的抽象类。它被称为“适配器”,在JDK中非常频繁(例如,请参阅MouseMotionListenerMouseMotionAdapter)。

扩展此课程时,您只能覆盖您想要支持的事件。

public abstract DroneEventAdapter implements DroneEventListener {
    @Override
    public void temperatureMeasured(EventObject event) {}

    @Override
    public void pressureMeasured(EventObject event) {}

    @Override
    public void disconnectEvent(EventObject event) {}

    @Override
    public void connectEvent(EventObject event) {}

    // Etc.
}

答案 2 :(得分:0)

我对你提出的问题的回答:我认为只能实现EventListener的一个函数,但是你仍然需要在代码中包含所需的所有方法,即使是空的存根。我已经多次遇到这种情况,我总是最终得到那些我不需要在底部实现为空存根的东西。