2014-07-06 55 views
0

我在嘗試註冊SensorEventListener但我的偵聽器類型錯誤。將類傳播到SensorEventListener

這裏是我的嘗試:

;; listener 
(gen-class 
:name com.spython.pushupcounter.main.sensor-listener 
:implements [android.hardware.SensorEventListener] 
:prefix "-" 
:methods [[onAccuracyChanged [android.hardware.Sensor Integer] void] 
        [onSensorChanged [android.hardware.SensorEvent] void]]) 

(def listener com.spython.pushupcounter.main.sensor-listener) 
(.registerListener sensor-manager listener proximitySensor 2) 

看起來我需要投listenerSensorEventListener,對不對?
我該怎麼做?

+0

你看到什麼錯誤?你可能需要添加一個[typehint](http://clojure.org/java_interop#Java%20Interop-Type%20Hints):'(.registerListener sensor-manager^SensorEventListener listener proximitySensor 2)' –

回答

2

與類名匹配的符號,如com.spython.pushupcounter.main.sensor-listener解析爲java.lang.Class的實例。所以你的listenerClass,這不是你想要的。它應該是com.spython.pushupcounter.main.sensor-listener的一個實例。可以使用標準實例化語法(com.spython.pushupcounter.main.sensor-listener.)創建實例 - 在末尾註釋. - 語法糖爲new。但即使在解決這個問題後,代碼也無法運行。 (gen-class)很難用這種方式。如果使用AOT編譯,它只會生成類,否則不會執行任何操作。您還必須提供SensorEventListener方法的實現。

更好的方法是使用(reify),它返回一個實現所需接口的對象。例如:

(defn listener [] 
    (reify 
    android.hardware.SensorEventListener 
    (onAccuracyChanged [_ sensor accuracy] 
     (comment onAccuracyChanged implementation here)) 
    (onSensorChanged [_ event] 
     (comment onSensorChanged implementation here)))) 

(.registerListener sensor-manager (listener) proximitySensor 2) 
+0

你幫我第二次了連續! – ivknv

+0

@SPython是否有可能共享工作源代碼? – Brian

+0

@Brian Back然後我寫了它在純Java(我有一些clojure-neko問題)...我有源代碼,但它不是Clojure。 – ivknv