Cours3 Android
Cours3 Android
Cours3 Android
Problmes
Une application peut ncessiter une opration qui prend beaucoup de temps. Linterface graphique (UI) est bloque pendant toute la dure de lopration. Android dtruit les UI qui ne rponde pas depuis trop longtemps.
Objectif
Solutions Android
Background thread : faire les oprations lourdes dans un thread Background service : faire les oprations lourde dans un service en tche de fond, en envoyant des notifications lutilisateur propos de la prochaine tape
Thread
Thread : modle
Thread : http://developer.android.com/reference/java/lang/Thread.html
Un Thread est un unit dexcution concurrente. Chaque thread a sa propre pile dappel (call stack). La pile est utilise chaque appel de mthode, passage de paramtre et stockage pour les variables locales. Chaque instance de machine virtuelle au moins un thread principal. Les Threads dans la mme VM interagisse et se sychronisent en utilisant des objets partags et des moniteurrs associs ces objets.
4
Thread : modle
Thread : excution
Il y a 2 manires dexcuter un code dans un Thread Crer une nouvelle classe qui tend (extends) la classe Thread et surcharge la mthode run().
Runnable myRunnable1 = new MyRunnableClass();
Crer une nouvelle instance de Thread ien lui passant un objet Runnable.
Thread t1 = new Thread(myRunnable1); t1.start();();
Dans les 2 cas, la mthode start() method doit tre appele pour excuter rellement le nouveau Thread.
6
Thread : excution
public class MainActivity extends Activity {
@Override
new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(2000); Log.i("Thread" , "coucou"); } catch (InterruptedException e) { e.printStackTrace(); } } }).start();
}//onCreate
7
Avantages du multithreading
Les Threads partagent les ressources du processus mais peuvent sexcuter en parallle. Les responsabilits peuvent tre partages
Le thread principal excute lUI Les tches lentes sont envoyes dans des threads en tache de fond
Un systme multithread sexcute plus vite onsur un systme qui possde plusieurs CPU.
Inconvnients du multithreading
Le thread principal maintient une file de message qui gre les interactions avec les objets applicatifs (ex : activits) et les UI associes.
La file de message contient soit des objets de type Message, soit de type Runnable.
On peut crer ses propres threads secondaires et les faire communiquer avec le thread principal en utilisant la classe Handler.
10
Le nouvel Handler est li la file dattente du thread dans lequel il a t cr. Il peut rcuprer les objets de la file de messages
La classe Handler
http://developer.android.com/reference/android/os/Handler.html
Il y a 2 faons principales dutiliser un Handler : 1. Pour envoyer un message destin dclencher lexcution dune action dans un autre thread. 2. Pour planifier des actions futures (runnables)
11
Thread et UI
Les Thread secondaires ne sont pas autoriss interagir avec linterface graphique. Seul le processus principal peut accder la vue de lactivit Les variables globales de classe peuvent tre vues et mises jour dans les Threads
12
Thread secondaire
Un thread secondaire qui veut communiquer avec le thread principal doit crer un nouveau Message par la mthode obtainMessage(). Une fois obtenu, le thread secondaire peut remplir le message avec des donnes et linsrer dans la file dattente du handler par la mthode sendMessage().
Le handler utilise la mthode handleMessage() pour se mettre en attente de nouveau messages destination du thread principal. Un message extrait de la file dattente peut soit transporter des donnes destination du thread principal, soit demander lexcution dobjets excutables (runnable) avec la mthode post().
13
14
sendEmptyMessage() : cre un message vide et linsre dans la file immdiatement sendMessage() : insre un message donne dans la file dattente immdiatement sendMessageAtFrontOfQueue() : insre le message en tte de la file dattente (message prioritaire) sendMessageAtTime(): insre le message dans la file un moment futur, exprim en millisecondes (SystemClock.uptimeMillis()) sendMessageDelayed() : insre le message dans la file dattente aprs un dlai, exprim en millisecondes
16
17
18
19
AsyncTask
20
AsyncTask : modle
http://developer.android.com/reference/android/os/AsyncTask.html
La classe AsyncTask permet dexcuter des oprations en tche de fond et de publier les rsultats dans linterface graphique sans avoir manipuler de thread ou de handler. Une tche asynchrone est dfinie par :
3 Types Gnriques Params, Progress, Result
21
La classe AsyncTask
Progress : le type des units de progression publis pendant lexcution en tche de fond .
Result : le type de rsultat de lexcution en tche de fond
Tous les types ne sont pas supports par les tches asynchrones,. Pour marquer un type inutilis, indiquer Void Note: la sytaxe String ... indique (Varargs) un tableau de String, similar to String[]
22
AsyncTask : mthodes
public private class VerySlowTask extends AsyncTask<String, Long,Void> {
// Dmarre : initialise les donnes locales, peut accder lUI protected void onPreExecute() {}
// Cest la tche de fond qui effectue lopration en tche de //fond et ne peut pas changer directement lUI protected Void doInBackground(final String... args) { publishProgress((Long) someLongValue); }
// mises jour priodiques. Peut changer lUI @Override protected void onProgressUpdate(Long... value) {} // fin. Peut utiliser lUI ici. protected void onPostExecute(final Void unused) {} }
23
AsyncTask : mthodes
Les mthodes dAsyncTask
onPreExecute() : invoque au dmarrage. Cette tape est normalement utilise pour initialiser la tche, par exemple en montrant une barre de progression linterface. doInBackground(Params... : invoque juste aprs la fin de onPreExecute(). Cette tape est utilise pour effectuer laction en tche de fond proprement parl et peut prendre beaucoup de temps. Les paramtres de la tche asynchrone sont passs cette tape. Le rsultat de lopration doit tre retourn par cette tape et seront passs la dernire tape. Cette tape peut aussi utiliser publishProgress(Progress...) tpour publier 1 ou plusieurs units de progression.Ces valeur sont publies au thread de lUI, ltape onProgressUpdate(Progress...).
onProgressUpdate(Progress...) : invoqu par le thread de lUI aprs un appel la mthode publishProgress(Progress...). Le timing de lexcution est indfinie.Cette mthode est utilise pour afficher nimporte quelle forme de progression dans lUI pendant que la tche de fond est toujours en cours dexcution., pour exemple pour animer une barre de progression ou pour montrer un log dans un champ texte. onPostExecute(Result), : invoque dans le thread de lUI aprs la fin de lexcution de la tche. Le rsultat de lopration de tchde de fond est pass cette tape en paramtre.
24
Exemple de AsyncTask
25
Activit principale
26
VerySlowTask (1)
27
VerySlowTask (2)
28
Les Services
29
Les Services
ATTENTION : mme si le Service sexcute de faon invisible, il sexcute dans le thread principal de lapplication. Il faut quil dmarre un thread secondaire si on veut rcuprer la main. Jcoute un fichier audio mp3, pendant que je navigue sur le web, Ds que je mempare du mobile, une sonnerie retentit, Les coordonnes GPS sont envoyes rgulirement, Ds que je mapproche dune zone dangereuse mon mobile steint,
Exemples dutilisation
30
Service
http://developer.android.com/reference/android/app/Service.html
android.app.Service Service local : services qui sexcutent dans le mme processus que votre application Service distant : services qui sexcutent dans des processus indpendants de votre application Unbounded : permet de dmarrer et de stopper le Service Bounded : permet en + lactivit dappeler des mthodes locale du Service
31
Mode Unbounded
Mode Bounded
Oprations
Des composant (des "clients") tablissent une connexion permanente afin d'interagir avec un service par le biais d'une interface
bindService(...) unbindService(...) + toutes les mthodes utiles que peut appeler lactivit sur le service
Oprations
32
5 mthodes de callback
33
Mode Unbounded
Implmenter onCreate() : initialisation des ressources Implmenter onStartCommand() : effectue le traitement et contient lIntent envoy Implmenter onDestroy() : rend les ressources
<service android:name=".MyService"></service> // cration du service et appel startCommand() sur le service startService(new Intent(MyActivity.this, MyService.class)) // arrt du service stopService(new Intent(MyActivity.this, MyService.class))
34
35
Mode Bounded
Etape 1 : crer une Activity qui va contrler le service et qui va pouvoir appeler des mthodes sur le service. Le service durera le temps de lactivit qui la cr. Etape 2 : crer une classe qui tend android.app.Service :
Implmenter onCreate() Implmenter onDestroy() Implmenter onBind() : retourne la liaison Implmenter onUnbind() : rcupre la liaison
<service android:name=".MyService"></service> Appel bindService(...) : rcupre la liaison sur le Service Appel unbindService(...) : libre la liaison sur le Service
Mode Bounded
MyService
1.
2. 3.
Crer un Binder : le service cre un objet mBinder de type Binder, qui implmente la mthode getService() en retournant linstance du service. Implmenter onBind() : le service retourne mBinder Implmenter les mthodes public supplmentaires que lactivit pourra appeler sur le service grce la liaison
MyActivity
1.
2. 3.
37
Crer un ServiceConnection qui implmente linterface ServiceConnection (mthodes onServiceConnected et onServiceDisconnected ) qui rcupre dans lactivit lobjet de liaison Appel bindService() en lui passant le ServiceConnection en paramtre Appel unbindService() en lui passant le ServiceConnection en paramtre
Exemple dAsyncTask
Dmarre une tche asynchrone et affiche une progression ainsi que des messages dinformations
38
39
40
41
Service
Thread
AsyncTask - Tche longue qui doit communiquer avec le Main Thread Pour des excutions parallles utiliserdes instances multiples ou un Executor Appel la mthode execute() Main Thread
Usage
- Tache sans UI, mais pas - Tache longue qui peut trop longue communiquer avec le thread - Utilisez des threads principal via un Handler dans des services pour - Pour des excutions les tches longues. parallles. Appel la mthode onStartService() Nimporte quel thread Thread.start() Nimporte quel thread
Trigger
Main Thread
Gestion manuelle des threads - Une seule instance peut tre excute la fois (un seul appel execute() possible) - Doit tre cr et excut par le Main Thread
Rfrences
Android Multi-Threading ,Victor Cleveland State University Android les Services, Receiver et processus , jeanmichel Douin (CNAM, France)
43