将类转换为SensorEventListener

时间:2014-07-06 08:04:34

标签: android clojure clojure-java-interop

我正在尝试注册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,对吧? 我怎么能这样做?

1 个答案:

答案 0 :(得分: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)