Comment utiliser AsyncTask
AsyncTask question
J'ai suivi quelques tutoriels mais il n'est toujours pas clair pour moi. Voici le code que j'ai actuellement avec quelques questions ci-dessous le code. MainActivity appels SomeClassWithHTTPNeeds, qui appelle la JSONParser (AsyncTask<>)
MainActivity:
String station = SomeClassWithHTTPNeeds.getInstance().getStation(123);
SomeClassWithHTTPNeeds:
getStation {
JSONParser = new JSONParser();
JSONObject station = parser.getJSONFromUrl("https://api....");
return JSONObject.getString("station");
}
JSONParser (AsyncTask< String, Nulle, String >)
protected String doInBackground(); ==> Seperate thread
protected void onPostExecute(); ==> On GUI thread
Je pensais:
--- Mis HTTPRequest dans doInBackground();
Problème est que je ne suis pas sûr de savoir comment:
obtenir le JSONParser pour retourner le JSONObject à la getStation méthode?
Ce que j'ai besoin de savoir
=> Où dois-je retourner le JSONObject: en arrière-plan ou de l'exécuter?
=> Comment puis-je utiliser le JSONParser une fois c'est une AsyncTask? Sera le execute() la fonction renvoie la valeur?
=> AsyncTask< String, Nulle, String > ==> Comment ça fonctionne? C'est le type de retour?
Merci beaucoup!
- Oh d'ailleurs, je n'ai jamais vu cette notation: "doInBackground(String... arg) {", quelqu'un peut-il m'expliquer?
- Il y a des tonnes d'exemples à ce sujet. Ma réponse est ici: stackoverflow.com/questions/16577700/...
- Meilleur AsyncTask Tutoriel plus
Vous devez vous connecter pour publier un commentaire.
Et faq générale explication de l'utilisation de l'AsyncTask
En général, vous devez effectuer les Opérations de Réseau dans un sujet Séparé -> doInBackground(); puisque vous ne voulez pas que votre INTERFACE utilisateur de figer lorsqu'une Opération Réseau prend son temps. Donc, vous devez vous connecter à votre Service ou .script php ou partout où vous obtenez les Données à partir de l'intérieur de la
doInBackground()
méthode. Vous pouvez également analyser les données et retourner l'analyse des données de ladoInBackground()
méthode en spécifiant le type de retour dedoInBackground()
à vos désirs, à propos de qui, là-bas. LeonPostExecute()
méthode recevrez ensuite vos valeurs renvoyées à partir dedoInBackground()
et de les représenter à l'aide de l'INTERFACE utilisateur.En général, le
AsyncTask
classe ressemble à ceci, qui n'est rien de plus qu'une classe générique avec 3 différents types génériques:Voici un Exemple d'un
AsyncTask
ressemblant à ceci:Nous avons de type String pour les Paramètres, de Type Integer pour le Progrès et le Type Long pour le Résultat (type de retour de
doInBackground()
). Vous pouvez utiliser n'importe quel type que vous souhaitez pour Params, les Progrès et les résultats.Dans ce cas, l'AsyncTask prend une Chaîne de caractères ou un Tableau de chaînes comme un Paramètre qui ressemblera à ceci une fois l'AsyncTask est appelé: (Le paramètre spécifié est utilisé dans le execute(param) méthode de AsyncTask).
Être conscient, que cet appel n'ont pas de valeur de retour, la seule valeur de retour que vous devez utiliser est celui renvoyé de
doInBackground()
. Utiliser le onPostExecute() la méthode ne font usage de la valeur retournée.Également être prudent avec cette ligne de code: (cette exécution va réellement avoir une valeur de retour)
L' .get() appel provoque le thread d'INTERFACE utilisateur à être bloqué (donc l'INTERFACE utilisateur se bloque si l'opération dure plus longtemps que quelques millisecons), tandis que l'AsyncTask est en cours d'exécution, parce que l'exécution ne pas prendre place dans un thread séparé. Si vous supprimez l'appel .get (), il va effectuer de manière asynchrone.
C'est une méthode avec un soi-disant "varargs" (variable d'arguments) paramètre. Pour faire simple, je vais juste dire que cela signifie que le nombre de valeurs que vous pouvez passer à la méthode par l'intermédiaire de ce paramètre n'est pas spécifié, et le montant des valeurs à la main, de la méthode sera traitée comme un tableau à l'intérieur de la méthode. Donc, cet appel pourrait par exemple ressembler à ceci:
mais il pourrait toutefois également ressembler à ceci:
ou même plusieurs paramètres. En supposant que nous parlons toujours de
AsyncTask
, les paramètres peuvent être accessibles dans ledoInBackground(String... params)
méthode:Vous pouvez en lire plus à propos de AsyncTask ici: http://developer.android.com/reference/android/os/AsyncTask.html
Aussi jeter un oeil à ce AsyncTask exemple: https://stackoverflow.com/a/9671602/1590502
get()
est aussi mauvais que la désactivation de l'NetworkOnMainThreadException
en la faisant sans fil puisqu'il est essentiellement le même résultat. Vous devriez OMI changement "faire attention" à ne jamais utiliser.Asynctask:
public class callCarWeb extends AsyncTask {
}
}
## Titre ##
Je pense que vous pouvez exécuter votre
HTTPRequest
dans votredoInBackground
de laAsync
tâche. EtJSONParser
àonPostExecute
.faire lire quelques les génériques.
maintenant, lorsque vous écrivez votre async task JSONParser ici
params
est de typeString
,progress
est de typeVoid
etresult
est de typeString
. Lire cette.généralement, les gens écrase les deux méthodes
doInBackground()
etonPostExecute()
, le premier prendparams
et renvoie unresult
et une seconde prend queresult
. Ce sontprotected
méthodes que vous ne pouvez pas appeler em directement. Alors vous pourriez vous demander comment envoyerparam
àdoInBackground()
, regardezexecute()
API.doInBackground()
s'exécute sur le thread d'arrière-plan, ce n'est pas unblocking call
!!ne le faites pas,
au lieu d'écrire sur
interface
dansJSONParser
ou quelque part d'autre, comme,maintenant votre
JSONParser
classe sera quelque chose comme,lorsque vous créez un objet de
JSONParser
ensembleOnParseCompleteListener
.maintenant vous décidez de l'endroit où passe ou créer votre propre écouteur.