Создание службы Android в Clojure

У меня есть довольно простое приложение, которое я написал в Clojure и хотел бы периодически автоматически выполнять одну из его функций. Я пытаюсь использовать Android AlarmManager запланировать задачу. Это то, что я до сих пор:

Android-документация для справки введите описание ссылки здесь

public class HelloIntentService extends IntentService {

  /**
   * A constructor is required, and must call the super IntentService(String)
   * constructor with a name for the worker thread.
   */
  public HelloIntentService() {
      super("HelloIntentService");
  }

  /**
   * The IntentService calls this method from the default worker thread with
   * the intent that started the service. When this method returns, IntentService
   * stops the service, as appropriate.
   */
  @Override
  protected void onHandleIntent(Intent intent) {
      // Normally we would do some work here, like download a file.
      // For our sample, we just sleep for 5 seconds.
      try {
          Thread.sleep(5000);
      } catch (InterruptedException e) {
          // Restore interrupt status.
          Thread.currentThread().interrupt();
      }
  }
}

Мой собственный прогресс в Clojure:

(gen-class
 :name adamdavislee.mpd.Service
 :extends android.app.IntentService
 :exposes-methods {IntentService superIntentService}
 :init init
 :prefix service)

(defn service-init []
  (superIntentService "service")
  [[] "service"])
(defn service-onHandleIntent [this i]
  (toast "hi"))

Я думаю, что я неправильно понимаю что-то тонкое; после оценки первого секса, символ adamdavislee.mpd.Service не связан и не является символом superIntentService,

2 ответа

Решение

Этот код работает, но только если проект перекомпилирован после добавления вызова gen-class, gen-class может генерировать классы только при компиляции проекта.

(gen-class
 :name adamdavislee.mpd.Service
 :extends android.app.IntentService
 :init init
 :state state
 :constructors [[] []]
 :prefix service-)
(defn service-init
  []
  [["NameForThread"]
   "NameForThread"])
(defn service-onHandleIntent
  [this i]
  (toast "service started"))

Сделаю некоторые предложения, основанные на чтении вашего кода (т.е. не уверен, что они будут работать)

Похоже, у вас могут быть проблемы с взаимодействием Java. Вы можете увидеть больше информации здесь. Это выглядит как :prefix также должна быть строкой. например

(gen-class
 :name adamdavislee.mpd.Service
 :extends android.app.IntentService
 :exposes-methods {IntentService superIntentService}
 :init init
 :prefix "service-")  ;;---> make this a string and append '-'

(defn service-init []
  (.superIntentService "service");;-> update with prepend dot-notation for Java interop
  [[] "service"])                ;;-> not sure what 'service' is doing here 
                                 ;;   perhaps consider an atom
(defn service-onHandleIntent [this i]
  (.toast "hi"))  ;;=> Not sure where this method is coming from, 
                  ;;   but guessing java interop need here as well

Этот пример также может дать полезную информацию. Надеюсь это поможет...

Другие вопросы по тегам