Android Speed imageDans ce tuto, nous allons voir comment il est possible, comme le titre l’indique, d’améliorer notre navigation sur notre smartphone Android préféré en utilisant des tâches asynchrones via la classe AsyncTask ! Sur Android, l’ensemble des éléments graphiques sont gérés à partir d’un thread principal que certaines appellent « UI thread« . Il est donc déconseillé d’utiliser ce thread pour des opérations coûteuses ( requêtes en base, chargement d’éléments depuis le web … ).

 Il faut considérer que toute opération nécessitant un temps de traitement supérieur à 5 secondes sera considérée comme nuisible. Une boite de dialogue s’ouvrira alors pour informer l’utilisateur que l’activité ne répond pas. Pour mieux comprendre ce comportement, nous allons réaliser une petite application dont le but est de provoquer un ARN ( … et non ce n’est pas une maladie, ou un genre de crise ), ARN signifie simplement « Activity not Responding ». Content

 

Voici notre main.xml :

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" >      <Button android:id="@+id/btn"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="Valider" />      <EditText    android:id="@+id/edittext"    android:layout_width="fill_parent"    android:layout_height="wrap_content"/>   </LinearLayout>

 

Comme on peut le voir, on aura un bouton qui va lancer une opération et une zone de saisie qu’on va essayer d’utiliser durant le traitement de l’opération. 

Voici maintenant le code de notre activité :

Code de l’activité
public class AsyncTastActivity extends Activity {    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);    Button btn = (Button) findViewById(R.id.btn);    btn.setOnClickListener(new OnClickListener() {    public void onClick(View v) {    dormir();    }    });    }     private void dormir(){     try {     Thread.sleep(10000);     } catch (InterruptedException e) {     }     }    }

 

Testez maintenant votre code :

Lancez le programme, cliquez sur le bouton puis aussitôt, essayez de saisir un mot dans la zone de saisie. Vous verrez donc apparaître la fameuse boite de dialogue Activitiy not Responding.

 

 

 

Pendant le traitement, on ne peut pas faire autre chose comme taper du texte dans un champ.

Pour résoudre ce problème, on peut utiliser la classe AsyncTask. Cette classe sera notre carte maîtresse pour réaliser des tâches de manière asynchrone. Elle crée un deuxième thread de manière à ne pas bloquer le thread principal !

La classe prend 3 paramètres d’entrées.

 

  • La paramètre fourni à la tâche de fond
  • Le type de donnée à transmettre pendant la progression de la tâche
  • Le type de donnée renvoyé par la tâche

La méthode doInBackground ( le traitement se fait dans cette méthode ) doit absolument être implémentée.

Les méthodes onPreExecute ( méthode appelée avant le début du traitement ), onProgressUpdate ( appelée durant le traitement ), onPostExecute ( appelée à la fin du traitement ) sont facultatives !

 

Reprenons donc notre application avec la classe AsyncTask :

Classe AsyncTask
public class AsyncTastActivity extends Activity {    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);    Button btn = (Button) findViewById(R.id.btn);    btn.setOnClickListener(new OnClickListener() {    public void onClick(View v) {    new UseTaskasync().execute();    }    });    }    private class UseTaskasync extends AsyncTask< Void, Void,Void >{         @Override     protected void onPreExecute() {    Toast.makeText(getApplicationContext(), "Début du traitement", Toast.LENGTH_LONG).show();     }      @Override     protected Void doInBackground(Void... params) {     try {     Thread.sleep(10000);     } catch (InterruptedException e) {     }     return null;     }     @Override     protected void onPostExecute(Void l) {     Toast.makeText(getApplicationContext(), "Fin du traitement", Toast.LENGTH_LONG).show();    }     } 

 

Relancez votre application, il est maintenant possible d’utiliser la zone de saisie tout de suite après le clic sur le bouton ! Ceci prouve bien que le traitement n’est pas réalisé par le thread principal mais par le deuxième créé par la classe AsyncTask.

 

 

La classe AsyncTask et ses méthodes permet donc de naviguer dans notre application ( rentrer du texte dans un champ ) tout en éxécutant une tâche au moyen de tâches asyncrones !

Merci d’avoir suivi ce tutoriel ! N’oublie surtout pas de VOTER et de la PARTAGER !!

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.