在Clojure中创建Android服务

时间:2017-10-09 02:04:08

标签: android clojure gen-class

我有一个相当简单的应用程序,我在Clojure中编写并希望定期自动执行其中一个函数。我正在尝试使用Android AlarmManager来安排任务。这就是我到目前为止所做的:

Android的参考文档enter link description here

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 个答案:

答案 0 :(得分:1)

会根据您的代码提出一些建议(即不确定这些是否有效)

看起来您可能遇到Java互操作问题。您可以看到更多信息here。看起来: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

This example也可能提供一些有用的见解。希望这会有所帮助...

答案 1 :(得分:0)

此代码有效,但前提是在将调用添加到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"))