2012-12-04 28 views
0

我正在开发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 
} 
+0

现在我知道[AndroidAnnotations](https://github.com/excilys/androidannotations)可以帮助这个。 :) – WonderCsabo

回答

1

我认为你可能需要重新考虑一下设计。

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

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

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

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

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

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

1

号一旦一个接口被实现,它的所有方法都必须重写。

1

是的,的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开箱即用。 然而,这不是不可能的,你可以使用Java 8通过Retrolambda https://github.com/orfjackal/retrolambda