2010-06-01 8 views
2

Je me demandais s'il était possible d'appeler des méthodes spécifiques définies dans la classe AsynTask à partir d'une autre classe et/ou service? Dans mon cas spécifique, j'ai un service de jouer des sons, mais le son est sélectionné dans une liste avec les sons disponibles ...Appelez les méthodes AsyncTask d'une autre classe/service (callbacks?)

Lorsqu'un son est sélectionné, il est téléchargé à partir de mon serveur domestique, cela prend un certain temps (pas beaucoup, disons autour des 3-4 secondes, les sons/effets ne sont pas de grande taille) ... Donc mon problème pour le moment est que j'ai un service pour jouer ces sons, et quand j'en sélectionne un que je voulais pour montrer un dialogue de progression ... Le moyen (si j'ai bien compris) est d'utiliser un AsyncTask, mais la seule chose que l'AsyncTask fera est de dire à mon Service de jouer un son spécifique de mon serveur ... Donc il n'y a pas de "callback" "Du service à l'Asynctask ...

Comment puis-je y parvenir? Comment puis-je appeler une asyncTask en cours d'exécution, qui se trouve dans une autre classe, et lui dire que tout le travail est fait et donc il peut cesser d'afficher le ProgressDialog? Ou est-ce que je le surpasse et il y a d'autres façons? Merci d'avance ...

Répondre

0

Je voudrais utiliser un asyncTask pour chaque téléchargement. Le travail de téléchargement est effectué dans la méthode doInBackground. Vous pouvez remplacer la méthode onPostExecute pour effectuer tout le travail qui doit être effectué après le téléchargement du son. Dans votre cas, je pense que ce serait cacher le progrès et dire au service de jeu que la nouvelle musique est disponible.

Pour plus d'informations sur le AsyncTask jeter un oeil à l'android documentation.

+0

Je me demandais juste ici, un service est un thread solitaire non? SO Je voudrais démarrer un AsyncTask (qui est aussi un thread), celui-ci devrait communiquer à mon service qu'il peut commencer à jouer, quand MediaPlayer de mon service a atteint l'état préparé, il devrait indiquer mon AsyncTask afin qu'il cesse d'afficher un ProgressDialog ... Cest ce que je veux mettre en œuvre, alors maintenant il question est: mon service peut-il envoyer des commandes/mises à jour à un AsyncTask déjà en cours d'exécution? – TiGer

+1

Pourquoi voulez-vous dire quelque chose à la tâche asynchrone? La tâche devrait indiquer quelque chose au service. – Janusz

+0

@TiGer: NON. Un service ne fonctionne PAS dans son propre thread. Les processus longs d'un service verrouillent l'interface utilisateur. – Falmarri

0

En fait, ce que je pense que vous voulez, c'est le contraire. Le AsyncTask doit être utilisé pour exécuter le processus de longue durée, et non pour afficher la boîte de dialogue de progression. En fait, vous ne devez pas utiliser le processus d'arrière-plan de la tâche pour accéder à une partie de l'interface utilisateur. Donc, ce que vous feriez est d'afficher une boîte de dialogue, démarrer votre tâche, puis la tâche quitter le dialogue dans sa méthode onPostExecute, qui peut manipuler les composants de l'interface utilisateur.

+0

Pour mon processus de longue durée, j'ai un service ... Maintenant, je dois être capable de dire à l'AsyncTask que mon service est prêt à faire ce qu'il est supposé faire ... – TiGer

+1

@TiGer: un asynctask est utilisé pour exécuter un arrière-plan de longue durée travail. Si cela est fait ailleurs, vous n'avez pas besoin d'une asyncTask. ProgressDialog est un composant de l'interface utilisateur. Si vous souhaitez communiquer de nouveau avec le thread UI à partir d'un autre thread qui n'est pas une asyncTask, utilisez un gestionnaire. – JRL

+0

ok, bien pour vous donner une idée de ce que j'essaie visuellement d'atteindre: l'utilisateur sélectionne un son d'une liste, puis un ProgressDialog (ou quelque chose de similaire) devrait être afficher, en attendant mon service de lecture audio les flux le son de mon serveur, ce qui peut prendre un certain temps, quand c'est fait et que MediaPlayer est prêt, il peut commencer à jouer et le ProgressDialog devrait simplement être supprimé ... – TiGer