2. 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
3. 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.
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 : 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();
}
6. 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
7. 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
8. 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
9.
10. 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
12. 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
16. 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
18. 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
19. Techniques de définition d’interface de
programmation
Étendre la classe Binder
Utiliser un Messenger
Utiliser AIDL (Android Interface Definition
Language)
19Saber LAJILI
20. 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
21. 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
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
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().
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
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
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
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
Les composants peuvent envoyer des requêtes, recevoir des réponses, et même effectuer une communication inter-processus (IPC)