obtenir thread principal message de la file d'attente et de gestionnaire
Comment puis-je obtenir le message de la file d'attente du thread principal à partir d'un autre thread? Looper.getMainLooper() est le principal fil du boucleur mais je suis incapable de trouver un moyen d'obtenir la MessageQueue pour un autre fil de boucleur. Par ailleurs, comment puis-je obtenir le gestionnaire pour le principal looper? Je suis incapable de trouver une façon de l'obtenir.
Pourquoi? Vous ne devriez pas avoir besoin de jouer avec la file d'attente directement.
Je veux juste ajouter un idleHandler pour vérifier si le thread principal est de faire quelque chose
J'ai un peu envie de vérifier si le thread principal de l'messagequeue est vide. Je suis nouveau sur ces concepts, et pensait à l'aide de idleHandler pour être averti lorsque la file d'attente est vide.
"J'ai en quelque sorte vouloir vérifier si le thread principal de l'messagequeue est vide" - pourquoi? Qu'est-ce que le problème de l'entreprise que vous essayez de résoudre? Si vous êtes nouveau à ces concepts", vous ne devriez pas obtenir au sein de 10km de la file d'attente de messages, à mon humble avis. Donc, je suis en train d'essayer de déterminer ce que vous espérez atteindre par cette approche, dans l'espoir que je peux trouver mieux, une solution plus facile pour vous.
Alors le thread principal registre de la
Je veux juste ajouter un idleHandler pour vérifier si le thread principal est de faire quelque chose
J'ai un peu envie de vérifier si le thread principal de l'messagequeue est vide. Je suis nouveau sur ces concepts, et pensait à l'aide de idleHandler pour être averti lorsque la file d'attente est vide.
"J'ai en quelque sorte vouloir vérifier si le thread principal de l'messagequeue est vide" - pourquoi? Qu'est-ce que le problème de l'entreprise que vous essayez de résoudre? Si vous êtes nouveau à ces concepts", vous ne devriez pas obtenir au sein de 10km de la file d'attente de messages, à mon humble avis. Donc, je suis en train d'essayer de déterminer ce que vous espérez atteindre par cette approche, dans l'espoir que je peux trouver mieux, une solution plus facile pour vous.
Alors le thread principal registre de la
IdleHandler
et en informer les autres parties, via une sorte de port d'écoute du mécanisme. Je ne vois pas la nécessité d'avoir un autre thread ce faire. "Pour tout cela, je suis en effet d'avoir à apporter des modifications, quelque part dans l'Android cadre, probablement très peu de changements.OriginalL'auteur r.v | 2011-07-02
Vous devez vous connecter pour publier un commentaire.
@r.v,
J'avais un besoin similaire. Je voulais savoir quand le MessageQueue est vide et quand je poste quelque chose pour elle de le faire et je veux savoir quand il est vide il ne reste à faire. J'ai regardé la
MessageQueue.IdleHandler
et celle-ci ne se comportent pas comme je voulais, je suis venu avec une autre solution.Dans mon cas, j'ai voulu utiliser la fonction Looper/Gestionnaire de mécanisme pour exécuter séquentiellement les téléchargements de fichiers. Fondamentalement, chaque téléchargement que je veux exécuter est enveloppé dans un Exécutable. Je veux seulement un à la fois afin d'être en cours d'exécution, de sorte que ce modèle fonctionne bien sans avoir à creuser dans les écrous et boulons de plus d'implication de filetage solution. En outre, je voulais savoir quand j'ai d'abord mis quelque chose dans la file d'attente et il commence son travail, et je voulais savoir quand il a été complètement terminé (la file d'attente est vide).
J'ai été en mesure d'utiliser le gestionnaire de message du mécanisme pour y parvenir. Les messages sont traités dans l'ordre le Runnables, de sorte que vous pouvez placer stratégiquement des messages dans la file d'attente pour vous aider à connaître les conditions de la file d'attente. Contrairement à Runnables dans le Gestionnaire de file d'attente, il y a quelques requêtes et de suppression des capacités pour les messages qui, à terme, fournir la solution.
Ce que je fais, c'est à chaque fois que j'ajoute un exécutable pour le Gestionnaire (via
Handler.post
), j'ai aussi supprimer toutes les instances de la coutumeQUEUE_EMPTY
message, puis ajouter une nouvelleQUEUE_EMPTY
message. Ceci assure que j'ai unQUEUE_EMPTY
message à la fin de la file d'attente. Une fois que je rencontre leQUEUE_EMPTY
message dans mon sous-classé Gestionnaire, je sais que je suis à la fin de la file d'attente. En outre, si je ne trouve pasQUEUE_EMPTY
message dans la file d'attente quand je vais ajouter un exécutable, je sais que la file d'attente était vide et que le fil était inactif.Que certains vont rapidement remarquer, il y a quelques vraies inefficacités avec cette solution. Avoir à parcourir la file d'attente pour ces "marqueur" des messages pouvaient être un véritable problème de performance si il y avait un grand nombre d'entrées dans la file d'attente. Dans mon cas, je fais face avec seulement une poignée de téléchargements de fichiers à la fois, alors les performances sont négligeables. Si vous avez une situation similaire, je pense que c'est plutôt une solution raisonnable. Il aurait été agréable pour le SDK Android pour fournir ces capacités de base à la
MessageQueue
. Je suis d'accord, idéalement, vous ne voulez pas salir avec le MessageQueue, mais de savoir quand il est au repos/de travail/vide sembler raisonnable des choses et je suis sûr qu'il y sont des nombres de scénarios quand il y a de la valeur, sachant ces choses.OriginalL'auteur Craig B
Utiliser la classe de Gestionnaire d'interagir avec un Looper message de la file d'attente.
À interagir avec les principal fil de la file d'attente de messages,
Vous pouvez maintenant envoyer, supprimer et recevoir des messages.
OriginalL'auteur Some Noob Student
Après que vous obtenez les threads principaux looper, vous devez simplement être en mesure d'appeler myQueue d'obtenir les principaux fils MessageQueue.
http://developer.android.com/reference/android/os/Looper.html#myQueue%28%29
Désolé, j'ai mal lu la question. MessageQueue est une structure interne, et je ne suis pas sûr si Android vous permet d'y accéder directement à partir de l'extérieur du filetage. Que voulez-vous faire avec le MessageQueue une fois que vous obtenez ce que ne peut pas être fait en utilisant le thread principal du gestionnaire et le looper?
Je veux ajouter un idleHandler pour vérifier si le thread principal est de ne rien faire. En passant, j'ai aussi besoin du gestionnaire pour le thread principal - j'ai édité ma question pour cela.
veuillez voir aussi les commentaires de @CommonsWare ci-dessus.
OriginalL'auteur RAnderson