2011-10-17 8 views
3

J'utilise MonoDroid Looper.MyQueue().AddIdleHandler() pour exécuter des commandes lorsque l'application est en mode inactif. Cela fonctionne dans une activité, mais si je commence la deuxième activité, elle se bloque jusqu'à ce que je touche l'écran ou redémarre la première activité. Theres pas de boucle ou quoi que ce soit qui pourrait bloquer la file d'attente dans la deuxième activité. Comment puis-je empêcher le boucleur de pendre?MonoDroid Looper.MyQueue() se bloque sur certaines activités/Idle Handler?

Looper.MyQueue().AddIdleHandler(new ExecuteRunner(appState)); 
public class ExecuteRunner : Java.Lang.Object, MessageQueue.IIdleHandler 
{ 
    int count = 0; 
    ApplicationState appState; 
    public ExecuteRunner(ApplicationState pAppState) 
    { 
     appState = pAppState; 
    } 

    public bool QueueIdle() 
    { 
     appState.YooManager.Manager.ExecuteCommand(); 
     count++; 
     Android.Util.Log.Debug("YooBik-Exe", count.ToString()); 
     return true; 
    } 
} 

La file d'attente des messages peut-elle être bloquée par quelque chose? Dans l'activité où le gestionnaire d'inactivité ne fonctionne pas, l'événement OnTouch est enregistré.

Ou est-ce que quelqu'un sait d'une autre façon comment implémenter un gestionnaire inactif pour monodroid?

Répondre

0

Vous ne savez pas si cela pose problème ou non, mais ExecuteRunner doit hériter de Java.Lang.Object et supprimer votre implémentation de Handle. Lorsque le système appelle votre méthode Handle, il déclenche une exception non gérée et entraîne la mort de votre thread/application.

+0

Est-ce que. Je n'ai pas réparé mon erreur. Je n'ai jamais eu d'exception, alors j'ai pensé que ça allait. – andineupert

1

Si elle se bloque jusqu'à ce que vous touchez l'écran, j'imagine qu'elle attend sur MessageQueue.next() (ligne this.wait();). Parce que votre activité principale looper.loop() appelle MessageQueue.next() et ce qu'il fait: while (ture) { 1. pullNextLocked() et renvoie s'il y a des msg à exécuter. sinon: 2. exécute tous les fichiers queueIdle(). puis 3. this.wait(); < ---------- C'est là que ça attend. }

Si vous appuyez sur touche puis MessageQueue.enqueueMessage (message < - touche msg) est appelé et exécute this.notify() qui fait le point 3 est ramène à la vie et le point 1 et 2 (votre queueIdle() est exécuté)

Pour le pirater, vous pouvez envoyer un message non-sens à partir de l'activité, ce qui déclenchera MessageQueue.enqueueMessage et la boucle MessageQueue.next() sera activée.

Meilleures salutations, Zbyszek