Android: Comment mettre à jour une INTERFACE utilisateur à partir du AsyncTask si AsyncTask est dans une classe à part?
Je déteste l'intérieur de la classe.
J'ai une activité principale qui lance une "courte vie" AsyncTask.
AsyncTask est dans un fichier séparé, n'est pas un intérieur de classe de l'activité principale
J'ai besoin async mises à jour de tâches d'un textView de l'Activité principale.
Je sais que je peux mettre à jour un TextView de onProgressUpdate, si AsyncTask est un intérieur de classe
Mais comment, en externe, indépendante, async task ?
Mise à JOUR: Cela ressemble de travail :
Dans acitivty j'appelle la tâche
backgroundTask = new BackgroundTask(this);
backgroundTask.execute();
Dans le constructeur, j'ai
public BackgroundTask(Activity myContext)
{
debug = (TextView) myContext.findViewById(R.id.debugText);
}
où debug est un domaine privé de AsyncTask.
Donc onProgressUpdate je peux
debug.append(text);
Merci pour toutes vos suggestions
- Vous signifie que dans une autre classe, vous souhaitez accéder à l'INTERFACE utilisateur ?
- Oui. J'ai besoin de mettre à jour un TextView de l'AsyncTask.
- Vous pouvez passer Contexte de votre constructeur et avec un moulage de votre ActivityClass, vous pouvez modifier textView à l'aide de runOnUIThread méthode.
Vous devez vous connecter pour publier un commentaire.
MODIFIER j'ai édité la réponse à utiliser
WeakReference
AsyncTask est toujours séparée de la classe de
Activity
, mais je suppose que tu veux dire que c'est dans le fichier différent de celui de votre classe d'activité de fichier, de sorte que vous ne pouvez pas bénéficier de l'activité intérieure de la classe. Simplement passer contexte d'Activité comme argument à votre Tâche Asynchrone (c'est à dire à son constructeur)et de les utiliser quand vous en avez besoin (rappelez-vous de ne PAS utiliser au cours de
doInBackground()
) c'est à dire de sorte que lorsque vous appelez normalementdans AsyncTask vous appelez à savoir
De noter que notre
Activity
peut-être disparu pendantdoInBackground()
est en cours (si la référence renvoyée peut devenirnull
), mais en utilisantWeakReference
nous ne l'empêchent pas de GC, de la collecte (et une fuite de mémoire) et que l'Activité est parti, il est généralement inutile d'essayer de le mettre à jour l'état (encore, selon votre logique, vous voudrez peut-être faire quelque chose comme un changement d'état interne ou de la mise à jour de la DB, mais le toucher de l'INTERFACE utilisateur doivent être ignorées).WeakReference
est mieux, mais je recommande @Ams réponse qui utilise une interface pour la communication. Il représente le couplage lâche, sans références qui se tiendra à l'AsyncTask lui-même. Même enseigné dans des Développeurs Android vidéo - youtube.com/... .À L'Aide De L'Interface
1) Créer une Interface
2) met en œuvre, dans votre Activité
3) Créer un constructeur dans AsyncTask(activité Activité){}
Inscrivez votre Interface en AsyncTask fichier
et d'appeler la méthode de l'interface comme ci-dessous.
Ici, votre OnPostExecute appellera après toutes les tâches effectuées par AsyncTask et obtenir des "résultats"
en tant que paramètre, qui est retourné par doInBackground(){ return "";}.
Alors que "dataSendToActivity.sendData(result);" il va appeler de l'activité surdéfini méthode "public void sendData(String str) {}".
Un cas limite: n'oubliez pas de passer
this
, c'est à dire vous de l'activité en cours du contexte deAsyncTask
et de ne pas créer une autre instance de votre activité, sinon votreActivity
sera détruit et un nouveau est créé.AsyncTask
dans une Activité.dataSendToActivity
simplement d'une activité qui met en œuvreOnDataSendToActivity
?Faire une fonction statique dans votre classe d'activité en passant contexte pour mettre à jour votre affichage de texte et ensuite appeler cette fonction dans votre AsynkTask classe de mise à jour.
De l'Activité de la classe:
public static void updateTextView(){
//votre code ici
}
Dans AynckTask classe d'appeler cette fonction.
Vient de passer le contexte (activité ou autre) pour votre AsyncTask dans un constructeur, puis dans onSuccess ou onProgressUpdate appel quel que soit vous avez besoin sur le contexte.
J'ai écrit une petite extension à AsyncTask pour ce genre de scénario. Il vous permet de garder votre AsyncTask dans une catégorie distincte, mais vous donne également un accès pratique pour les Tâches d'achèvement de l':
Donc d'abord vous étendre ListenableAsyncTask au lieu de AsyncTask. Puis dans votre code de l'INTERFACE utilisateur, de faire un exemple concret et défini listenWith(...).
La Question a déjà été répondu, encore im affichage de la façon dont il devrait être fait, je suppose..
Classe Mainactivity
maintenant dans la async classe
//placer ce code à l'intérieur de votre classe d'activité et également déclarer la mise à jour de textview statique