2017-10-09 1 views
2

J'ai une application assez simple, que j'ai écrite dans Clojure et que je voudrais exécuter automatiquement l'une de ses fonctions périodiquement. J'essaie d'utiliser AlarmManager d'Android pour planifier la tâche. Voilà ce que j'ai jusqu'à présent:Création d'un service Android dans Clojure

Documentation de Android pour référence 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(); 
     } 
    } 
} 

Mon progrès dans 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")) 

Je pense que je suis malentendu quelque chose de subtil; après avoir évalué le premier sexp, le symbole adamdavislee.mpd.Service est non lié, et le symbole superIntentService non plus.

Répondre

0

Ce code fonctionne, mais seulement si le projet est recompilé après avoir ajouté l'appel à gen-class. gen-class peut uniquement générer des classes lors de la compilation d'un projet.

(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

fera quelques suggestions basées sur la lecture de votre code (à savoir pas sûr si ceux-ci travailleront)

Il semble que vous pourriez avoir un problème avec le Java Interop. Vous pouvez voir plus d'infos here. Il semble que :prefix devrait être une chaîne aussi bien. par exemple.

(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 peut également fournir quelques indications utiles. Espérons que cela aide ...

+0

Merci; Je me rapproche maintenant, en particulier cela m'a aidé à réaliser que 'superIntentService' était exposé comme une méthode et non un symbole régulier. –