我正在尝试注册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)
看起来我需要将listener
投放到SensorEventListener
,对吧?
我怎么能这样做?
答案 0 :(得分:2)
匹配类名称的符号(例如com.spython.pushupcounter.main.sensor-listener
)会解析为java.lang.Class
的实例。因此,listener
是Class
,这不是您想要的。它应该是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)