Android appelant AsyncTask juste après un autre fini
J'ai un problème avec Android AsyncTask. Il y a une Activité qui contient quelques TextView un bouton et une photo. Lorsqu'un utilisateur a entré cette activité que je lance une asynctask pour vérifier si l'utilisateur peut aller vers de l'activité (jusqu'à ce que la tâche de ne pas terminer le bouton n'est pas actif). Alors je veux commencer un autre asyntask pour obtenir de l'image.
J'ai donc fait une inner classe:
AsyncTask<String, Void, JSONObject>() authTask = new AsyncTask<String, Void, JSONObject>() {
@Override
protected JSONObject doInBackground(String... params) {
//call the rest api
}
@Override
protected void onPostExecute(JSONObject result) {
//check the result
//and make another asynctask
AsyncTask<String, Void, Bitmap> imageTask = new Async.... {
//get image
}
imageTask.execute();
}
}
et je l'appelle
authTask.execute();
du thread d'INTERFACE utilisateur.
J'ai un mauvais pressentiment à ce sujet, en particulier, il semble ne fonctionne pas (c'est ok quelques fois, mais tout à coup, il "freeze": pas d'exception, juste suspendu et la barre de progression, c'est de filer. Rien ne se passe et le bouton ne sera pas actif).
Il y a une autre façon d'obtenir de l'information et quand elle a fini de démarrer immédiatement une autre tâche?
UDPATE:
Je travail avec l'api de niveau 10. Dans authTask-je obtenir de l'information qui est nécessaire pour démarrer imageTask (une pièce d'identité) et j'ai donc appeler ces tâches dans une rangée. L'api de niveau 10, c'est possible?
Merci d'avance!
Br, Peter
- Êtes-vous sûr que l'auth tâche a vraiment fini. Peut-être que le gel soit en raison d'une longue http délai d'attente?
- Je suppose que vous avez débogué les bits
doInBackground
qui peut accrocher presque indéfiniment? Êtes-vous à l'aide de time-out qui sont raisonnables lors de l'appel de votre API REST? Généralement, la seule exigence pour unAsyncTask
est que vous créez sur le thread d'INTERFACE utilisateur qui vous êtes en train de faire. - Oui j'ai essayé de déboguer et je ne peux pas reproduire le problème lors du débogage... L'autre chose, c'est le délai d'attente. J'ai mis délai raisonnable, mais cette cause et un autre bug, une autre classe. (C'est probablement mon mauvais, besoin d'un complément d'enquête.)
Vous devez vous connecter pour publier un commentaire.
vous pouvez utiliser
getStatus()
vérifie si leAsyncTask
est en attente, en cours ou terminé.et quand finsh commencer votre nouvelle tâche.comme:exemple de votre application:
1:
Vous pouvez écrire le code pour authTask et puis pour imageTask, l'un après l'autre, au sein d'un seul
doInBackground()
. Cette unique AsyncTask exemple, pourrait être un feu par un seulexecute()
déclaration. Cela peut ou peut ne pas être possible selon le besoin de l'INTERFACE utilisateur interactions.2:
Edit: comme l'a noté kabuku cette information est surtout pour en Nid d'abeille+. Avant en Nid d'abeille, je voudrais certainement aller avec l'option 1 ci-dessus. executeOnExecutor() est l'api de niveau 11+
Dans receent versions,
execute()
enverra votre AsyncTasks en série par défaut (ICS+). Si vous voulez vous assurer que ce qui se passe, spécifiez le numéro de série exécuteur testamentaire.Dans votre cas, ce serait:
Et les versions plus récentes d'un simple
De la AsycnTask.execute() de la documentation:
PS:
Pour exécuter des tâches indépendantes les unes des autres, vous devez utiliser le
AsyncTask.THREAD_POOL_EXECUTOR
. Qui nécessite un autre exécuteur testamentaire:Ce n'est pas un bon design de nid d'AsyncTask. Faire tout le levage lourd dans doInBackground et simplement publier/mettre à jour les résultats. En d'autres termes, combiner le traitement de deuxième AsyncTask dans votre premier.
doInBackground
contient un// call the rest api
commentaire. le résultat de cet appel, apparemment unJSONObject
est analysée & envoyé à l'étape suivante - qui dans son cas est un autreAsyncTask
.À partir du code que tu as montré, il ne semble pas faire sens pour frayer deuxième tâche. Seulement obtenez-vous l'image à l'intérieur de
doInBackground
de la première tâche à droite après l'autorisation.Si vous avez besoin de mettre à jour l'INTERFACE utilisateur entre les deux, vous pouvez le faire en cours de mise à jour.
J'ai une idée pour faire asynchrone série en seulement une tâche asynchrone:
Et dans votre thread principal appelez simplement async task comme ceci:
Et enfin, vous pouvez cacher vos progrès sur onPostExecute comme:
J'ai résolu ce genre de problème quand j'ai eu à télécharger quelque chose à partir d'une base de données avant la connexion de l'utilisateur dans l'application, avec cela j'ai corrigé ce problème.
À utiliser
ObservableInteger
vous pouvez le faired'abord la déclarer
puis dans votre onCreate vous aurez un écouteur d'attente pour les valeurs de la mObsInt de changer, après ceux de la modification des valeurs que vous pouvez faire tout ce que vous voulez
L'affirmative, comment il fonctionne
ObservableInteger
sera à la recherche de changements dans la variablemObsInt
, donc permet de dire simObsInt
est égal à 1, il va faire quelque chose, si est égal à 2 va faire autre chose, donc, pour résoudre ce problème avec 2asynctasks
est facile, lorsque l'un desasynctasks
finitionsmObsInt
sera égale à 1 , si l'autreasyncTask
termine doncmObsInt
seramObsInt++
, puis votremObsInt
sera égal à 2, l'auditeur sera en attente pour les valeurs, et puis faire ce que vous voulez faire quand les valeurs correspondent à votre si de tresorerie auonCreate
méthodemaintenant, juste à votre asynctasks il suffit de mettre dans votre onPostExecute() la méthode de cette ligne
ainsi, si la première async terminer, mObsint == 1 , si la seconde finition mObsInt == 2, et ensuite vous manipulez ce que vous voulez faire dans votre méthode onCreate
espère que cette aide pour vous, il m'a aidé à
Vous pouvez obtenir plus d'informations à ce doc : https://developer.android.com/reference/android/databinding/ObservableInt.html
bon codage !