【问题标题】:Avoid implementing unused Listener methods避免实现未使用的 Listener 方法
【发布时间】:2012-12-04 19:00:10
【问题描述】:

我正在开发一个 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
}

【问题讨论】:

标签: java android inheritance listener


【解决方案1】:

没有。实现接口后,必须重写其所有方法。

【讨论】:

    【解决方案2】:

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

    这是一个将 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

    【讨论】:

      【解决方案3】:

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

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

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

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

      2. MapActivity 和 SimpleGestureListener 等所有不同的侦听器将填充共享队列,您的 MyAppEventTriggerQueue 将通过触发您的自定义事件来响应该队列。

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

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

      【讨论】:

        【解决方案4】:

        你可以使用抽象类:

         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;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-11-24
          • 1970-01-01
          • 2013-12-30
          • 2020-06-16
          • 2011-11-11
          • 1970-01-01
          • 2015-08-20
          • 2015-12-18
          相关资源
          最近更新 更多