AsynchTask, Service,
Thread
Version Janvier 2014
1Saber LAJILI
problématique
• L’activityManager impose un delai aux UIThread
(5s)
• Les traitements long (io, calcul, connexion ..)
doivent être exécuté dans des threads séparés
• Seul le UIThread (MainThread) est capable de
mettre à jour l’interface, aucun autre thread n’en a
le droit
Thread
• Thread dit aussi processus léger, fil d’exécution 
Processus lourd
• C’est un fil d’exécution d’une suite d’instruction
d’un processus lourd.
• les threads d'un même processus se partagent sa
mémoire virtuelle. Par contre, tous possèdent leur
propre pile d’exécution.
Avantages:
- Rendre l'utilisation d'une application plus fluide,
car il n'y a plus de blocage durant les phases de
traitements intenses.
Thread
Création de thread
1. Package : java.lang.Object et java.lang.Thread
2. Classe hérite de la classe Thread ou implémente
l’interface Runnable
3. Définir la méthode run()
4. Appeler la méthode start() depuis l’objet de la classe
– commutation de contexte (context switch) entre
deux threads est moins coûteuse que la commutation de
contexte entre deux processus.
–Conseiilé à l’utiliser pour la gestion de l’interface exp:
traitement de texte, …
Exemple
Eemple : 2venement de téléchargement d’une image par
un thread :
construct a new Thread and pass aRunnable to the constructor
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
Bitmap b =
loadImageFromNetwork("http://example.com/image.png")
;
mImageView.setImageBitmap(b);
}
}).start();
}
AsynTask
 AsyncTask?
AsyncTask est une classe abstraite générique
 Nécessaire pour optimiser l’exécution des opérations
longues en background
 Retourne son résultat dans UI thread (actvité courante)
sans être obligé de manipuler les threads
 L’application principale se lance dans un seul thread
 En cas d’accès à un serveur en réseau (Exp:
authentification) , l’interface user reste en attente sans
réponse !!! En cas de crash l’application en entier se
crash!!!
6Saber LAJILI
Solution
 Implémenter ce type de traitement dans un
nouveau thread sans manipuler les thread par :
AsynchTask
 Possibilité d’annuler la tâche (Task) sans perturber
le UI principale
7Saber LAJILI
Définition
1. Etendre la classe générique AsynchTask uses 3
types <Params, Progress, Result>
1. Params – the input. what you pass to the AsyncTask
2. Progress – if you have any updates, passed to
onProgressUpdate()
3. Result – the output. what returns doInBackground()
2. Surcharger les méthodes :
1. onPreExecute()
2. doInBackground(Params…)
3. onProgressUpdate()
4. onPostExecute(Result)
8Saber LAJILI
Principe d’exécution
1. Une instance de task créé est exécutée par la méthode
“execute()”
1. “execute()” fait appel à doInBackground (Params) et
onPostExecute(Result)
2. Le paramètre input params est passé à doInBackground
(Params…) et à onPostExecute (Result)
3. doInBackground(Params…) contient le code à exécuter
dans le nouveau thread
4. onPostExecute(Result) se synchronise avec l’activité
principale et le permet de se modifier
10Saber LAJILI
Démo
ProgressDialogProgressBar
11Saber LAJILI
Service
 Un service est un composant qui s'exécute en
arrière-plan, sans IHM
 Un service n'a pas de durée définie
 la fin d’une activité n’entraine pas sa terminaison
 Nécessaire pour les opérations longues et
répétitives (Exp: les téléchargements sur
Internet)
 Un service s'exécute par défaut dans le processus
principal de l'application.
 Possible de l’exécuter dans un nouveau thread
12Saber LAJILI
13Saber LAJILI
Service
cycle de vie
Types de services :
 Started service
 Bounded service
14Saber LAJILI
Service
Création
Démarrage et arrêt d’un service
15Saber LAJILI
Started Service
création et exécution
Démo:
1. Créer une nouvelle classe qui étend la classe «
Service »
2. Redéfinir ses méthodes
3. Déclarer ce service comme composant dans le
fichier manifest.xml
4. Appeler/arrêter ce service par startService() et
stopService().
16Saber LAJILI
Started Service
Démo
17Saber LAJILI
Bounded Service
 Un bound service (service connecté) est un serveur
dans une interface client-serveur
 Permet aux composants (tels que les activités,
content Provider et service) de se lier au service,
 la liaison à un service, par la méthode onBind ()
 Plusieurs clients peuvent se connecter au service à la fois
 ne s'exécute pas dans le fond indéfiniment
 Lorsque le dernier client se déconnecte du service, le
système détruit le service
18Saber LAJILI
Techniques de définition d’interface de
programmation
 Étendre la classe Binder
 Utiliser un Messenger
 Utiliser AIDL (Android Interface Definition
Language)
19Saber LAJILI
Démo
On se propose de réaliser un serveur de
temps. Chaque fois que le client demande
la date et l’heure, le serveur lui répond
Démarche:
Réaliser une activité qui demande le temps
au près de serveur
Interface de programmation: Binder
20Saber LAJILI
Démo
Côté service :
Créer un service dans votre application en héritant
de la classe « Service »
Créer la classe "LocalBinder" dans votre service et
étendre la classe "Binder".
Dans cette classe implémenter la méthode «
onBind() » du service ensuite retouner l’instance de
la classe "LocalBinder"
21Saber LAJILI
Démo
• Côté client « activity » :
• Créer le composant "Client" de type activité et créer
une instance de l’interface "ServiceConnection".
• Implémenter les deux méthodes de cette interface
onServiceConnected() et onServiceDisconnected().
• Dans la méthode onServiceConnected, vous allez avoir
une instance de IBinder, ainsi forcez le comme type (cast
it) classe LocalBinder déjà créé dans le service.
• Implémenter la méthode onStart() et connecter au service
en utilisant la méthode bindService()
• Implémenter la méthode onStop() et déconnecter de
service en utilisant la méthode unbindService()
22Saber LAJILI
Démo
23Saber LAJILI

4 asynch task_services_thread

  • 1.
  • 2.
    problématique • L’activityManager imposeun delai aux UIThread (5s) • Les traitements long (io, calcul, connexion ..) doivent être exécuté dans des threads séparés • Seul le UIThread (MainThread) est capable de mettre à jour l’interface, aucun autre thread n’en a le droit
  • 3.
    Thread • Thread ditaussi processus léger, fil d’exécution  Processus lourd • C’est un fil d’exécution d’une suite d’instruction d’un processus lourd. • les threads d'un même processus se partagent sa mémoire virtuelle. Par contre, tous possèdent leur propre pile d’exécution. Avantages: - Rendre l'utilisation d'une application plus fluide, car il n'y a plus de blocage durant les phases de traitements intenses.
  • 4.
    Thread Création de thread 1.Package : java.lang.Object et java.lang.Thread 2. Classe hérite de la classe Thread ou implémente l’interface Runnable 3. Définir la méthode run() 4. Appeler la méthode start() depuis l’objet de la classe – commutation de contexte (context switch) entre deux threads est moins coûteuse que la commutation de contexte entre deux processus. –Conseiilé à l’utiliser pour la gestion de l’interface exp: traitement de texte, …
  • 5.
    Exemple Eemple : 2venementde téléchargement d’une image par un thread : construct a new Thread and pass aRunnable to the constructor public void onClick(View v) { new Thread(new Runnable() { public void run() { Bitmap b = loadImageFromNetwork("http://example.com/image.png") ; mImageView.setImageBitmap(b); } }).start(); }
  • 6.
    AsynTask  AsyncTask? AsyncTask estune classe abstraite générique  Nécessaire pour optimiser l’exécution des opérations longues en background  Retourne son résultat dans UI thread (actvité courante) sans être obligé de manipuler les threads  L’application principale se lance dans un seul thread  En cas d’accès à un serveur en réseau (Exp: authentification) , l’interface user reste en attente sans réponse !!! En cas de crash l’application en entier se crash!!! 6Saber LAJILI
  • 7.
    Solution  Implémenter cetype de traitement dans un nouveau thread sans manipuler les thread par : AsynchTask  Possibilité d’annuler la tâche (Task) sans perturber le UI principale 7Saber LAJILI
  • 8.
    Définition 1. Etendre laclasse générique AsynchTask uses 3 types <Params, Progress, Result> 1. Params – the input. what you pass to the AsyncTask 2. Progress – if you have any updates, passed to onProgressUpdate() 3. Result – the output. what returns doInBackground() 2. Surcharger les méthodes : 1. onPreExecute() 2. doInBackground(Params…) 3. onProgressUpdate() 4. onPostExecute(Result) 8Saber LAJILI
  • 10.
    Principe d’exécution 1. Uneinstance de task créé est exécutée par la méthode “execute()” 1. “execute()” fait appel à doInBackground (Params) et onPostExecute(Result) 2. Le paramètre input params est passé à doInBackground (Params…) et à onPostExecute (Result) 3. doInBackground(Params…) contient le code à exécuter dans le nouveau thread 4. onPostExecute(Result) se synchronise avec l’activité principale et le permet de se modifier 10Saber LAJILI
  • 11.
  • 12.
    Service  Un serviceest un composant qui s'exécute en arrière-plan, sans IHM  Un service n'a pas de durée définie  la fin d’une activité n’entraine pas sa terminaison  Nécessaire pour les opérations longues et répétitives (Exp: les téléchargements sur Internet)  Un service s'exécute par défaut dans le processus principal de l'application.  Possible de l’exécuter dans un nouveau thread 12Saber LAJILI
  • 13.
  • 14.
    Service cycle de vie Typesde services :  Started service  Bounded service 14Saber LAJILI
  • 15.
    Service Création Démarrage et arrêtd’un service 15Saber LAJILI
  • 16.
    Started Service création etexécution Démo: 1. Créer une nouvelle classe qui étend la classe « Service » 2. Redéfinir ses méthodes 3. Déclarer ce service comme composant dans le fichier manifest.xml 4. Appeler/arrêter ce service par startService() et stopService(). 16Saber LAJILI
  • 17.
  • 18.
    Bounded Service  Unbound service (service connecté) est un serveur dans une interface client-serveur  Permet aux composants (tels que les activités, content Provider et service) de se lier au service,  la liaison à un service, par la méthode onBind ()  Plusieurs clients peuvent se connecter au service à la fois  ne s'exécute pas dans le fond indéfiniment  Lorsque le dernier client se déconnecte du service, le système détruit le service 18Saber LAJILI
  • 19.
    Techniques de définitiond’interface de programmation  Étendre la classe Binder  Utiliser un Messenger  Utiliser AIDL (Android Interface Definition Language) 19Saber LAJILI
  • 20.
    Démo On se proposede réaliser un serveur de temps. Chaque fois que le client demande la date et l’heure, le serveur lui répond Démarche: Réaliser une activité qui demande le temps au près de serveur Interface de programmation: Binder 20Saber LAJILI
  • 21.
    Démo Côté service : Créerun service dans votre application en héritant de la classe « Service » Créer la classe "LocalBinder" dans votre service et étendre la classe "Binder". Dans cette classe implémenter la méthode « onBind() » du service ensuite retouner l’instance de la classe "LocalBinder" 21Saber LAJILI
  • 22.
    Démo • Côté client« activity » : • Créer le composant "Client" de type activité et créer une instance de l’interface "ServiceConnection". • Implémenter les deux méthodes de cette interface onServiceConnected() et onServiceDisconnected(). • Dans la méthode onServiceConnected, vous allez avoir une instance de IBinder, ainsi forcez le comme type (cast it) classe LocalBinder déjà créé dans le service. • Implémenter la méthode onStart() et connecter au service en utilisant la méthode bindService() • Implémenter la méthode onStop() et déconnecter de service en utilisant la méthode unbindService() 22Saber LAJILI
  • 23.

Notes de l'éditeur

  • #9  1. onPreExecute() – called on the UI thread before the thread starts running. This method is usually used to setup the task, for example by displaying a progress bar.    2. doInBackground(Params…) – this is the method that runs on the background thread. In this method you should put all the code you want the application to perform in background. Referring to our Simple RSS Aplication, you would put here the code that downloads the XML feed and does the parsing. The doInBackground() is called immediately after onPreExecute(). When it finishes, it sends the result to the onPostExecute().    3. onProgressUpdate() - called when you invoke publishProgress() in the doInBackground().    4. onPostExecute(Result) – called on the UI thread after the background thread finishes. It takes as parameter the result received from doInBackground().
  • #15 Started service : s’exécute dans le processus de l’application Bounded service : s’exécute dans des processus indépendants de celui de l’application
  • #16 Started service : s’exécute dans le processus de l’application Bounded service : s’exécute dans des processus indépendants de celui de l’application
  • #17 Started service : s’exécute dans le processus de l’application Bounded service : s’exécute dans des processus indépendants de celui de l’application
  • #18 Started service : s’exécute dans le processus de l’application Bounded service : s’exécute dans des processus indépendants de celui de l’application
  • #19 Les composants peuvent envoyer des requêtes, recevoir des réponses, et même effectuer une communication inter-processus (IPC)