2012-12-04 26 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