приведение класса к SensorEventListener

#android #clojure #clojure-java-interop

#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. Какую ошибку вы видите? Возможно, потребуется добавить подсказку типа : (.registerListener sensor-manager ^SensorEventListener listener proximitySensor 2)

Ответ №1:

Символы, соответствующие имени класса, например, 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)
  

Комментарии:

1. Ты помог мне второй раз подряд!

2. @SPython Возможно ли, что вы делитесь рабочим исходным кодом?

3. @Brian Тогда я закончил тем, что написал его на чистой Java (у меня были некоторые проблемы с clojure-neko)… У меня есть исходный код, но это не Clojure.

4. @SPython Хорошо! Спасибо за сверхбыстрый ответ!