Je lisais AsyncTask
et j'ai essayé le programme simple ci-dessous. Mais cela ne semble pas fonctionner. Comment puis-je le faire fonctionner?
public class AsyncTaskActivity extends Activity {
Button btn;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener((OnClickListener) this);
}
public void onClick(View view){
new LongOperation().execute("");
}
private class LongOperation extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
for(int i=0;i<5;i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
TextView txt = (TextView) findViewById(R.id.output);
txt.setText("Executed");
return null;
}
@Override
protected void onPostExecute(String result) {
}
@Override
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
}
J'essaie juste de changer l'étiquette après 5 secondes en arrière-plan.
Voici mon main.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminate="false"
android:max="10"
android:padding="10dip">
</ProgressBar>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start Progress" >
</Button>
<TextView android:id="@+id/output"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Replace"/>
</LinearLayout>
android
android-asynctask
Renard
la source
la source
Réponses:
Ok, vous essayez d'accéder à l'interface graphique via un autre thread. Ceci, dans l'ensemble, n'est pas une bonne pratique.
L'AsyncTask exécute tout à l'
doInBackground()
intérieur d'un autre thread, qui n'a pas accès à l'interface graphique où se trouvent vos vues.preExecute()
etpostExecute()
vous offre un accès à l'interface graphique avant et après le levage de charges lourdes dans ce nouveau thread, et vous pouvez même transmettre le résultat de la longue opération àpostExecute()
pour afficher ensuite les résultats du traitement.Voir ces lignes où vous mettez ultérieurement à jour votre TextView:
Mettez-les
onPostExecute()
.Vous verrez alors votre texte TextView mis à jour après la
doInBackground
fin.J'ai remarqué que votre écouteur onClick ne vérifie pas quelle vue a été sélectionnée. Je trouve que la façon la plus simple de le faire est via les instructions switch. J'ai un cours complet édité ci-dessous avec toutes les suggestions pour éviter la confusion.
la source
onPostExecute(String result)
méthode. Il serait plus clair pour les futurs lecteurs que l'argument est rempli par la valeur de retour dedoInBackground(String... params)
.Ma réponse complète est ici , mais voici une image explicative pour compléter les autres réponses sur cette page. Pour moi, comprendre où allaient toutes les variables était la partie la plus déroutante au début.
la source
params
est un tableau. (Dans l'exemple ci-dessus, c'était unString
tableau.) Cela vous permet de passer plusieurs paramètres du même type. Ensuite , vous pouvez accéder à ces paramètres avecparams[0]
,params[1]
,params[2]
, etc. Dans l'exemple, il n'y avait qu'un seulString
dans leparams
tableau. Si vous devez transmettre plusieurs paramètres de différents types (par exemple, aString
et anint
), consultez cette question .Je suis sûr qu'il s'exécute correctement, mais vous essayez de modifier les éléments d'interface utilisateur dans le thread d'arrière-plan et cela ne fonctionnera pas.
Modifiez votre appel et AsyncTask comme suit:
Classe d'appel
Remarque: Je suggère personnellement d'utiliser
onPostExecute()
partout où vous exécutez votre thread AsyncTask et non dans la classe qui étend AsyncTask elle-même. Je pense que cela rend le code plus facile à lire, surtout si vous avez besoin de AsyncTask à plusieurs endroits pour gérer les résultats légèrement différents.Classe LongThread (étend AsyncTask):
la source
onPostExecute
de l'activité est génial.J'ai créé un exemple simple d'utilisation d'AsyncTask d'Android. Cela commence par
onPreExecute(), doInBackground(), publishProgress()
et enfinonProgressUpdate()
.En cela, doInBackground () fonctionne comme un thread d'arrière-plan, tandis que d'autres fonctionnent dans le thread d'interface utilisateur. Vous ne pouvez pas accéder à un élément d'interface utilisateur dans doInBackground (). La séquence est la même que celle que j'ai mentionnée.
Cependant, si vous devez mettre à jour un widget à partir de
doInBackground
, vous pouvez appeler àpublishProgress
partirdoInBackground
duquel mettreonProgressUpdate
à jour votre widget UI.Appelez ça comme ça dans votre activité:
Référence développeur ici
la source
Déplacez ces deux lignes:
hors de la
doInBackground
méthode de votre AsyncTask et les mettre dans laonPostExecute
méthode. VotreAsyncTask
devrait ressembler à ceci:la source
AsyncTask
, auquel ma réponse répond; et l'envoi d'une valeur d'un service au thread d'interface utilisateur, que l'autre discussion aborde. Ces problèmes sont indépendants.Contexte / Théorie
AsyncTask vous permet d'exécuter une tâche sur un thread d'arrière-plan, tout en publiant les résultats sur le thread d'interface utilisateur.
la mise en oeuvre
AsyncTask est une classe générique. (Il prend des types paramétrés dans son constructeur.)
Il utilise ces trois types génériques:
Params
- le type des paramètres envoyés à la tâche lors de l'exécution.Progress
- le type des unités de progression publiées lors du calcul en arrière-plan.Result
- le type du résultat du calcul d'arrière-plan.Ces trois paramètres correspondent à trois fonctions principales dans lesquelles vous pouvez remplacer
AsyncTask
:doInBackground(Params...)
onProgressUpdate(Progress...)
onPostExecute(Result)
Pour exécuter AsyncTask
execute()
avec paramètres à envoyer à la tâche en arrière-plan.Ce qui se produit
Sur le thread principal / UI ,
onPreExecute()
est appelé.Sur un fil d'arrière - plan ,
doInBackground(Params...)
est appelé.Params
ont été passés viaexecute
.)Doit remplacer au moins
doInBackground()
pour utiliser AsyncTask.Appelez
publishProgress(Progress...)
pour mettre à jour l'interface utilisateur avec un affichage de la progression (par exemple, animation de l'interface utilisateur ou texte du journal imprimé) pendant que le calcul en arrière-plan est toujours en cours d'exécution.onProgressUpdate()
appeler.Sur le thread d'arrière - plan, un résultat est renvoyé par
doInBackground()
.Sur le thread principal / UI ,
onPostExecute()
est appelé avec le résultat renvoyé.Exemples
Dans les deux exemples, la «tâche de blocage» est un téléchargement à partir du Web.
Exemple A
La
doInBackground()
méthode télécharge l'image et la stocke dans un objet de type BitMap. LaonPostExecute()
méthode prend le bitmap et le place dans ImageView.Exemple B
Exemple d'exécution B
la source
Lorsqu'une tâche asynchrone est exécutée, la tâche passe par quatre étapes:
Voici un exemple de démonstration:
Et une fois que vous avez créé, une tâche est exécutée très simplement:
la source
Exemple le plus court pour faire simplement quelque chose de manière asynchrone:
Pour l'exécuter:
la source
Comment mémoriser les paramètres utilisés dans AsyncTask?
Si vous êtes nouveau dans AsyncTask, il est très courant de se tromper lors de l'écriture d'une AsyncTask. Les principaux coupables sont les paramètres utilisés dans la tâche AsyncTask, c'est-à-dire
AsyncTask<A, B, C>
. Sur la base des A, B, C (arguments) signature des méthodes, ce qui rend les choses encore plus confuses.Rester simple!
La clé est de ne pas mémoriser . Si vous pouvez visualiser ce que votre tâche doit vraiment faire, écrire la tâche AsyncTask avec la signature correcte à la première tentative serait un jeu d'enfant. Il suffit de comprendre ce que votre
Input
,Progress
etOutput
sont, et vous serez bon d'aller.Qu'est-ce qu'une AsyncTask?
AsyncTask est une tâche d'arrière-plan qui s'exécute dans le thread d'arrière-plan. Il prend un
Input
, effectueProgress
et donne unOutput
.Par exemple:
Quelle est la relation avec les méthodes?
Comment écrire cela dans le code?
Comment allez-vous exécuter cette tâche?
la source
Lorsque vous êtes dans le thread de travail, vous ne pouvez pas manipuler directement les éléments de l'interface utilisateur sur Android.
Lorsque vous utilisez AsyncTask, veuillez comprendre les méthodes de rappel.
Par exemple:
Pour info: pour accéder au thread d'interface utilisateur à partir d'un thread de travail, vous utilisez la méthode runOnUiThread () ou la méthode de publication dans votre vue.
Par exemple:
Cela vous aidera à mieux connaître les choses. Par conséquent, dans votre cas, vous devez définir votre affichage de texte dans la méthode onPostExecute ().
la source
Je recommanderais de vous faciliter la vie en utilisant cette bibliothèque pour les travaux d'arrière-plan:
https://github.com/Arasthel/AsyncJobLibrary
C'est aussi simple que ça ...
la source
Exemple de tâche asynchrone avec demande POST:
la source
Simplement:
la source
Vous devez déclarer le bouton surclicklistener. Une fois cliqué, il appelle la classe AsyncTask DownloadJson.
Le processus sera indiqué ci-dessous:
la source
la source
Mise à jour: mars 2020
Selon la documentation officielle du développeur Android , AsyncTask est désormais obsolète.
Il est recommandé d'utiliser à la place des corourines kotlin . Simplement, il vous permet d'écrire des tâches asynchrones dans un style séquentiel.
la source
Exemple d'exemple AsyncTask avec progression
la source
Tâche ASync;
la source
MyTask
intérieur de la classeMainActivity
? Est-ce habituel?En travaillant avec AsyncTask, il est nécessaire de créer un successeur de classe et d'enregistrer la mise en œuvre des méthodes nécessaires pour nous. Dans cette leçon, nous examinerons trois méthodes:
doInBackground - sera exécuté dans un nouveau thread, et ici nous résolvons toutes nos tâches difficiles. Parce qu'un thread non principal n'a pas accès à l'interface utilisateur.
onPreExecute - exécuté avant doInBackground et a accès à l'interface utilisateur
onPostExecute - exécuté après doInBackground (ne fonctionne pas si AsyncTask a été annulé - à ce sujet dans les prochaines leçons) et a accès à l'interface utilisateur.
Voici la classe MyAsyncTask:
Et voici comment appeler votre activité ou fragment:
la source
si vous ouvrez la classe AsyncTask, vous pouvez voir le code ci-dessous.
Fonctionnalités AsyncTask
exemple
la source
Modifiez votre code comme indiqué ci-dessous:
la source