Cours3 Android

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 43

Cours 3 : programmation Android

Thread, AsyncTask, Service

Android et les tches lentes

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

Conserver lUI interactive malgr lopration en cours

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

public void onCreate( Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);


// on peut aussi encapsuler le code dans une mthode prive

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

Le treading offre une abstraction utilie pour la programmation concurrente

Un systme multithread sexcute plus vite onsur un systme qui possde plusieurs CPU.

Inconvnients du multithreading

Le code tend tre plus complexe

Il faut dtecter, viter et rsoudre les interblocages (deadlocks)

Interagir avec un Thread

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

Communication entre Threads

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().

Handler du thread principal


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

Communication entre Threads

14

Communication par Message

En attente des messages


15

Envoie des messages

Communication par Message

Les mthodes SendMessage


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

Exemple dactivit avec un Thread

17

Exemple dactivit avec un Thread (2)

18

Communication par Runnable

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

4 Etats onPreExecute, doInBackground, onPostExecute

1 Mthode auxiliaire publishProgress

La classe AsyncTask

AsyncTask <Params, Progress, Result> Types gnriques


Les types gnriques de AsyncTask Params : le type des paramtres ddinput envoys la tche lexcution

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

Un service est une activit sans interface graphique

Sert effectuer des oprations ou des calculs en dehors de linteraction utilisateur

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

Un service est une classe qui tend

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

Deux architectures de services


Deux modes de liaison (valables pour les 2 architectures)


31

Dmarrage et arrt dun Service

Mode Unbounded

Mode Bounded

Un composant dmarre et arrte un traitement en tche de fond comme il le souhaite


startService(...) stopService(...)
Un Service peut supporter les 2 types dutilisation.

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

Cycle de vie dun service

5 mthodes de callback

onCreate() onStart() SDK<2.0 onStartCommand() onDestroy() onBind() onUnbind()

Sexcute dans le processus courant

33

Mode Unbounded

Etape 1 : crer une Activity qui va contrler le service

Etape 2 : crer une classe qui tend android.app.Service.


Implmenter onCreate() : initialisation des ressources Implmenter onStartCommand() : effectue le traitement et contient lIntent envoy Implmenter onDestroy() : rend les ressources

Etape 3 : dclaration dans le Manifest comme fils de llment <application>

<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))

Etape 4 : ajouter le code de contrle du Service dans lActivity


34

Code gnrique dun Service Unbounded

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

La mthode onStartCommand ne sera pas appele

Etape 3 : dclaration dans le Manifest comme fils de llment <application>

<service android:name=".MyService"></service> Appel bindService(...) : rcupre la liaison sur le Service Appel unbindService(...) : libre la liaison sur le Service

Etape 4 : ajouter le code de contrle du Service dans lActivity



36

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

Mode Bounded : Activity

39

Mode Bounded : Service (classe interne)

40

Mode Bounded : Service (2)

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

Dmarr par (thread)


Runs On (thread)

Main Thread

Son propre thread

Thread secondaire. Mais lUI du Main Thread reste accessible.

- Peut bloquer le Main Thread


Limitations
42

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

Vous aimerez peut-être aussi

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy