#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 Хорошо! Спасибо за сверхбыстрый ответ!