2017-10-09 5 views
2

Ich habe eine ziemlich einfache App, die ich in Clojure geschrieben habe und möchte regelmäßig eine seiner Funktionen automatisch ausführen. Ich versuche, Android AlarmManager zu verwenden, um die Aufgabe zu planen. Das ist, was ich habe, so weit:Erstellen eines Android-Dienstes in Clojure

Android in der Dokumentation Referenz 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(); 
     } 
    } 
} 

Meine eigenen Fortschritt in 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")) 

Ich glaube, ich bin Missverständnis etwas subtiler; nach Auswertung des ersten Sexp ist das Symbol adamdavislee.mpd.Service ungebunden und das Symbol superIntentService auch nicht.

Antwort

0

Dieser Code funktioniert, aber nur, wenn das Projekt neu kompiliert wird, nachdem der Aufruf an gen-class hinzugefügt wurde. gen-class kann nur Klassen generieren, wenn ein Projekt kompiliert wird.

(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")) 
1

Werden einige Vorschläge machen, basierend auf Ihren Code zu lesen (das heißt nicht sicher, ob diese funktionieren)

Es sieht aus wie Sie ein Problem mit dem Java-Interop haben. Sie können mehr Informationen sehen here. Es sieht aus wie :prefix sollte auch eine Zeichenfolge sein. z.B.

(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 könnte auch einige hilfreiche Einblicke bieten. Hoffe, das hilft ...

+0

Vielen Dank; Ich komme jetzt näher, insbesondere half es zu erkennen, dass 'superIntentService' als Methode und nicht als normales Symbol dargestellt wurde. –

Verwandte Themen