避免实现未使用的Listener方法

时间:2012-12-04 19:00:10

标签: java android inheritance listener

我正在开发一款Android应用,并使用this教程在地图上捕捉双击事件。但我认为这是一个更普遍的问题。因此,要获得有关特定事件的通知,我必须实现大量的侦听器。这些都有很多我不会用的方法,所以这些只是“污染”我的代码。是的,我可以使用一个监听器适配器类,但我也必须继承其他超类,并且遗憾的是,Java中没有多重继承。另外,在这种情况下我不能使用委托,因为我的Activity类也必须是监听器(至少我认为)。 那么,在Java中是否有任何方法可以实现所使用的方法,并以某种方式摆脱其他方法?

这是描述问题的示例代码:

// ...

public class MainActivity extends MapActivity implements OnItemSelectedListener, OnGestureListener, OnDoubleTapListener {

    // ... my methods

    public boolean onDoubleTap(MotionEvent e) {
        // actually this method is used by me only
    }

    // ... lots of other implemented listener methods what I do not use
}

4 个答案:

答案 0 :(得分:2)

没有。实现接口后,必须覆盖其所有方法。

答案 1 :(得分:2)

是的,使用 Java 8 ,您可以使用 默认 来有效地忽略未使用/不需要的方法。

这是一个扩展OnDoubleTapListener以仅关注onDoubleTap()方法的示例

interface OnDoubleTapOnlyListener extends GestureDetector.OnDoubleTapListener
{
    default boolean onSingleTapConfirmed(MotionEvent e) { return false; }

    boolean onDoubleTap(MotionEvent e);

    default boolean onDoubleTapEvent(MotionEvent e) { return false; }
}

然后你可以实现onDoubleTap,其他人将被忽略。

很遗憾,Android尚不支持开箱即用的Java 8。 但是,您可以通过Retrolambda https://github.com/orfjackal/retrolambda

使用Java 8

答案 2 :(得分:0)

我想你可能需要重新考虑一下这个设计。

显然需要您的应用程序响应各种事件,这些事件是由需要不同侦听器的机制生成的,但您只关心触发器的子集。

我要做的是实现MyAppEventTriggerQueue(它可以使用 内部http://developer.android.com/reference/java/util/concurrent/ConcurrentLinkedQueue.html

  1. 该对象必须有一个工作线程,可以监听队列更改并触发您的自定义回调。

  2. 所有不同的侦听器(如MapActivity和SimpleGestureListener)都会通过触发自定义事件来填充MyAppEventTriggerQueue将响应的共享队列。

  3. 这样你就可以从各种接口和实现中解开你的自我,抽象出除了你需要的事件之外的所有事情。

    这是一项更多的工作,但它最终应该是一个更清洁的解决方案。

答案 3 :(得分:0)

您可以使用抽象类:

 abstract  class DoubleTapListener implements   GestureDetector.OnDoubleTapListener {
    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        return false;
    }

    @Override
    abstract public boolean onDoubleTap(MotionEvent e);

    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {
        return false;
    }


}
public class MainActivity extends DoubleTapListener{

    @Override
    public boolean onDoubleTap(MotionEvent e) {
        return false;
    }
}