Début AsyncTask à partir d'un autre AsyncTask doInBackground()
Je suis en train de commencer un AsyncTask à partir d'un autre AsyncTask est doInBackground()
-méthode...
Est-ce même possible? Si oui, comment puis-je y parvenir?
PLUS TARD EDIT:
L'idée est que je commence un asynctask cela va me faire de statuts de Tweeter ... Tout est ok jusqu'ici ... Mais quand je rencontre certains tweets j'ai besoin de les modifier avec quelques infos de mon serveur, ici, je vais faire une autre exploitation du réseau, et depuis que j'ai besoin d'attendre jusqu'à ce que je obtenir de l'information à partir de mon serveur, je ne m':
GetContent getContentServiceAsyncTask = new GetContent(context);
try {
tweetText = Uri.decode(getContentServiceAsyncTask.execute(
URL_GET_CONTENT, jsonRequest).get());
} catch (InterruptedException e) {
Log.e(TAG_DEBUG, "InterruptedException: ", e);
} catch (ExecutionException e) {
Log.e(TAG_DEBUG, "ExecutionException: ", e);
}
Ce est démarré à partir du déjà commencé AsyncTask dans doInBackground() la méthode ...
Je sais que je peux simplement ajouter des méthodes dans l'AsyncTask et il suffit d'appeler dans le doInBackground() la méthode, mais j'ai besoin de les utiliser dans d'autres endroits, où je commence ces AsyncTasks de onPostExecute ...
Les gars si vous pensez qu'il est facile de contourner ce pour ce, qui n'affectera pas ma performance, qui sera grande ... si non je vais faire quelques méthodes statiques que je vais appeler dans tous les AsyncTasks j'ai besoin(mais cela va m'obliger à modifier une grande partie de mon code)
C'est possible, mais il va se planter si vous essayez de modifier l'INTERFACE utilisateur de la onPostExecute sur la deuxième tâche, puisqu'elle n'est pas en cours d'exécution dans le thread principal.
SI votre deuxième tâche ne contient pas d'INTERFACE utilisateur, vous pouvez commencer.
Sa conseillé de commencer async dans l'après exécution de la première asynchrone.
Hi Noir, votre premier async tâche doit s'exécuter sur la tâche parallèle artitecture. Ainsi, vous commencez votre première tâche avec exécuteur ==> "nouvelle FirstTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, <paramètres>);" la Deuxième exécution de la tâche dans votre firsttask de doInbackgreound(). Je vais créer des exemples d'application et d'écrire la réponse.
OriginalL'auteur Ionut Negru | 2013-10-22
Vous devez vous connecter pour publier un commentaire.
Selon le post ci-dessous, vous pouvez faire Activité.runOnUiThread() pour exécuter un Exécutable sur-le-main-Fil (à partir d'un autre thread).
Donc, théoriquement, vous pourriez faire ceci:
Comme son nom l'indique de l'Activité.runOnUiThread() exécute la exécutables sur-le-main-fil
Mais c'est le genre de hacky.
Code devrait ressembler à quelque chose comme ceci: (pas de test)
Ce imbriquée exemple n'est pas un bon style à utiliser dans la production, parce que (à mon humble avis) de ses illisible.
Remarques Supplémentaires:
Activité.runOnUiThread(Runnable) est pas statique! C'est pourquoi mon exemple utilise ParentActivity(.c').runOnUiThread(Runnable).
public class DoSomeBackgroundWork extends AsyncTask<String, String, Boolean> {...}
fait un exemple de base
Merci jmeier, mais je reçois le message d'avertissement suivant: "ne Pas enfermer instance du type TwitterActivity est accessible dans la portée
Vous devez appeler une référence à votre TwitterActivity instance. Voulez-vous faire?
Non, mais à la fin, je pense que ce sera trop de mal et mauvais pour la performance, j'ai donc créé les méthodes que j'ai eu besoin d'appeler directement dans ce AsyncTask ... pourtant, je pense que vous répondez était le plus proche de ce que je cherchais, donc je vais l'accepter. Je vous remercie.
OriginalL'auteur Langusten Gustel
AsyncTasks
sont censés fonctionner à partir de principal (UI) thread. Vous ne devez pas exécuter un autre AsyncTask de doInBackground parce que cette méthode est exécutée sur un non-thread d'INTERFACE utilisateur.Dans votre cas, je peux vous suggérer deux choses:
Pourquoi le downvote? Cela fait sens.
Je ne peux pas le faire ... j'ai besoin d'un blocage de l'AsyncTask, que j'appelle .get() ... je ne peux pas attendre jusqu'à ce que l'AsyncTask est fini et faire la mise à jour en onPostExecute().
OriginalL'auteur waqaslam
Vous ne pouvez pas faire dans
doInBackground()
mais vous pouvez à partir deonProgressUpdate()
par exemple puisqu'il s'exécute sur le thread d'INTERFACE utilisateur. Il suffit de garder à l'esprit que, après 3,0 ils seront placés sur la même file d'attente et ne sera pas s'exécuter en parallèle, voir executeOnExecutorOriginalL'auteur Dan Pena
Consultez la documentation de
AsyncTask()
etAsyncTask#execute()
. À la fois de l'état qu'ils doivent être invoquée sur le main thread d'INTERFACE utilisateur.Votre question était: "est-ce même possible". Ma réponse est "non" (au moins pas directement). Vous devrez poster un exécutable sur le thread principal, contenant le code qui exécute la nouvelle
AsyncTask
à la place. jmeier réponse donne une façon possible de le faire.Oui, merci, Alex Lockwood, en fin de compte j'ai choisi de modifier la structure pour éviter ce problème et être en sécurité dans l'avenir 🙂 ...
OriginalL'auteur Alex Lockwood
Essentiellement de l'échantillon que j'ai écrit;
OriginalL'auteur nurisezgin
C'est simple, vous devez utiliser un Exécuteur testamentaire:
new AsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new String[]{"param 1", "param 2"});
OriginalL'auteur Antônio Sérgio Ferraz
c'est pas mieux de prendre ces quelques inet actions et de les impliquer en démarrer un Thread séparé qui va gérer cette partie de la gestion des données ?
google mettre partout c'est des modèles qui, si u regarder de plus près, elles sont toutes dérivées de simples classes... cette API permet android, comme une toile d'araignée de rappel impliquant de rappel... Essayer de comprendre les bases de java et il ne sera pas difficile d'écrire un morceau de code de qualité. Services/contenus résolveurs/récepteurs/chargeurs sont limitées en quelque sorte... Threads sont presque en mesure de réaliser tout ce que tu souhaite...
La plupart d'entre vous utilise le code sans réfléchir et ne pas même essayer de comprendre comment il fonctionne, et comprendre ce qui est la clé de programmation. J'essaie de ne pas utiliser de code dont les bases, je ne sais pas. Et si j'en ai besoin j'ai étudié à fond. J'ai utilisé Java pour la magie noire maintenant, je pense que c'est le FLUX de DONNÉES A-> B-> C, etc .. bonne circulation est essentiel.
EDIT:
oui, j'ai écrit la solution pour youre problème
il y a de nombreuses façons de réaliser que ce que tu veux mais c'est pas de ma réponse à l'écrivain de code pour vous
vous pouvez utiliser IntentService classe à laquelle il est intégré dans la file d'attente --- il suffit d'utiliser distinct startService() appelle pour chaque transfert.
vous pouvez utiliser Thread - ma préférée façon
vous pouvez utiliser le Service de
vous pouvez utiliser AsyncTaskLoader
mais ne pas utiliser de ASYNC TASK si u besoin de tirer plus de DEUX liés les uns avec les autres à la FOIS ils sont tous sur les TÉLÉPHONES MODERNES s'EXÉCUTE en tant que la FILE d'attente sur un seul thread (ps. vous pouvez les exécuter sur EXECUOR comme une solution de contournement)
Depuis JAVA 1.5 tâches sont séparées de threads
- il a été ajouté
quoi faire du veux dire par la coutume fil
THREAD (comme nous en parler) n'est pas un THREAD OBJET de CLASSE mais c'est une TÂCHE définie dans la méthode run() de la CLASSE THREAD, donc toute CLASSE DÉRIVÉE de THREAD COMMENCE TOUJOURS THREAD (aka TÂCHE)
comme ceci par exemple dans POSIX :
à partir de ce point, nous pouvons parler de MULTITÂCHE lors de l'OS est de l'exécution de plusieurs tâches sur une certaine période de temps en exécutant simultanément
depuis JAVA 1.5 ther est une Exécuteur interface qui fournit un moyen de découplage de la tâche de mémoire de la mécanique de la façon dont chaque tâche doit être exécutée, y compris les détails de fil de l'utilisation, de la planification, etc. L'exécuteur testamentaire est normalement utilisé à la place explicitement la création de threads. Vous avez beaucoup d'exécuteurs testamentaires de l'un d'eux est: ThreadPerTaskExecutor
pour en revenir à AsyncTask:
et oui si vous ne Vous sentez pas à la hauteur et de ne pas en savoir assez beeter à quelqu'un d'autre de le faire 🙂
OriginalL'auteur ceph3us