63
1 ère partie (thread en java) indépendant d’Android. Certains exemples en java « classique » Ressource (textes) : http://docs.oracle.com/javase/tutorial/essential/concurrency/ http://developer.android.com/guide/components/processes-and- threads.html

1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

  • Upload
    dohanh

  • View
    232

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

1ère partie (thread en java) indépendant d’Android. Certains exemples en java « classique »

Ressource (textes) :

http://docs.oracle.com/javase/tutorial/essential/concurrency/

http://developer.android.com/guide/components/processes-and-threads.html

Page 2: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 02 / 53

Lancement d’une application ou d’un programme : un thread « graphique » qui gère les événements et le rafraichissement.

Et pour le reste ? (connexion http, traitement long, etc.)

Objectif : ne pas « geler » l’interface…

des Threads ? Thread en Java AsyncTask Handler

Page 3: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 03 / 53

• Multitâche : exécution en parallèle de différentes partie d’un programme

• Processus : contexte d’exécution (espace mémoire, etc.)

– Contient au moins un thread

• Thread : contexte d’exécution dans un processus

– Partage de ressources

– « moins lourd » qu’un processus

des Threads ? Thread en Java AsyncTask Handler

Page 4: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 04 / 53

• Répartition des tâches sur plusieurs processeurs

– Programmation parallèle…

• Simplification de code (par isolation)

• Interface graphique réactive (ne pas bloquer le “main” thread)

des Threads ? Thread en Java AsyncTask Handler

Page 5: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 05 / 53

• Difficulté à écrire

– Ordre et temps d’exécution non connu à l’avance

– Accès concurrents

– Interdépendance

• Difficulté à débugger (pas abordé ici)

– Tests unitaires séparés (mock object)

– Tests d’intégration

des Threads ? Thread en Java AsyncTask Handler

Page 6: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 06 / 53

Mise en évidence des problèmes

des Threads ? Thread en Java AsyncTask Handler

Page 7: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 07 / 53

• API de haut-niveau (pas d’appel système direct)

• Deux objets pour l’exécution

– L’objet qui contrôle

– L’objet qui exécute (code du thread)

des Threads ? Thread en Java AsyncTask Handler

Page 8: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 08 / 53

• Interface Runnablepublic void run( ) ; // code à exécuter

• Class Thread

– Classe qui implements Runnable (méthode run vide)

– Association avec le code à exécuter

• Par héritage et surcharge de la méthode run Constructeur

• Par construction avec un « Runnable » en paramètre

– Nom (au constructeur, {set|get}Name ) : pour débug ou communication par message

des Threads ? Thread en Java AsyncTask Handler

Page 9: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 09 / 53

• Méthode start( )– « déroule » le code de la méthode « run » associée– Exécution en parallèle– Ce n’est pas limité à une classe : on peut tout utiliser, sous réserve d’erreur accès

concurrent

• Appel à run( ) directement : l’exécution serait alors séquentielle (non parallèle) dans le même « thread »

• Le thread est terminé lorsque la méthode « run » l’est – Boucle pour faire durer– Relance impossible (même en rappelant la méthode start)

• java.lang.IllegalThreadStateException si le thread n’est pas fini• Pas d’erreur, mais il ne se passe rien si c’est fini…• Il faut refaire un objet / thread…

des Threads ? Thread en Java AsyncTask Handler

Page 10: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 10 / 53

basé sur un transparent de Richard Grindes Threads ? Thread en Java AsyncTask Handler

Nouveau Thread

New Thread( )

Page 11: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 10 / 53

basé sur un transparent de Richard Grindes Threads ? Thread en Java AsyncTask Handler

Eligible pour

exécution

Nouveau Thread

New Thread( )

start( )

Page 12: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 10 / 53

basé sur un transparent de Richard Grindes Threads ? Thread en Java AsyncTask Handler

Eligible pour

exécution

En cours d’exécution

Nouveau Thread

New Thread( )

start( )

Le système « passe »à ce thread

Page 13: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 10 / 53

basé sur un transparent de Richard Grindes Threads ? Thread en Java AsyncTask Handler

Eligible pour

exécution

En cours d’exécution

Mort

Nouveau Thread

New Thread( )

start( )

Fin

Le système « passe »à ce thread

Page 14: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 10 / 53

basé sur un transparent de Richard Grindes Threads ? Thread en Java AsyncTask Handler

Eligible pour

exécution

En cours d’exécution

Mort

Nouveau Thread

New Thread( )

start( )

Fin

Le système « passe »à ce thread

Bloqué

Page 15: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 11 / 53

• void start()• static void sleep(long) throws InterruptedException• void join() throws InterruptedException• static void yield()

• boolean isAlive( )

• void interrupt()– Interrompre un processus (InterruptedException)

• static boolean interrupted()– Le processus courant est-il interrompu ?

• static Thread currentThread()– Placée dans une méthode de n’importe quelle classe, elle retourne l’objet Thread qui contrôle le thread qui exécute cette

méthode au moment où currentThread est appelé• Gestion des priorités d’exécution

– int getPriority()– void setPriority(int)

basé sur un transparent de Richard Grindes Threads ? Thread en Java AsyncTask Handler

Page 16: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 12 / 53

• Exemple cas d’école :– Augmenter un compte (compteur)

– 3 sources d’augmentation différentes

• Comme en système, il faut attendre la fin des processus – On ne sait pas dans quel ordre…

– Attente « manuelle » « active »• sleep (de thread ou de TimeUnit)

– pour ne pas sur-occuper le(s) processeur(s)

– Le thread garde la main

– Attente la fin d’un thread : méthode join( )

des Threads ? Thread en Java AsyncTask Handler

Page 17: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 13 / 53

Eligible pour

exécution

En cours d’exécution

Mort

Nouveau Thread

New Thread( )

start( )

Fin

Le système « passe »à ce thread

Bloqué

des Threads ? Thread en Java AsyncTask Handler

Page 18: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 13 / 53

Eligible pour

exécution

En cours d’exécution

Mort

Nouveau Thread

New Thread( )

start( )

Fin

Le système « passe »à ce thread

Bloqué

des Threads ? Thread en Java AsyncTask Handler

Page 19: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 13 / 53

Eligible pour

exécution

En cours d’exécution

Mort

Nouveau Thread

New Thread( )

start( )

Fin

Le système « passe »à ce thread

Bloqué

sleep / fin du délai

join / fin du thread rejoint

des Threads ? Thread en Java AsyncTask Handler

Page 20: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 14 / 53

• Interruption par le « scheduler » – Le thread peut se faire interrompre pour qu’un autre soit exécuter– Sauvegarde / restauration de l’état… mais entre temps les « valeurs ont

changées »– => cas de mémoire inconsistante– => résultat « aléatoire »

• Besoin de synchronisation– Déclarer une variable volatile

• Toute modification sur une variable sera répercutée dans les autres threads (notion de "happens-before")

– Utilisation du mot clef synchronized

des Threads ? Thread en Java AsyncTask Handler

Page 21: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 15 / 53

• Objectif : faire en sorte qu’un seul thread exécute une partie du code– « Atomicité » du code : pas d’entrelacement d’exécution

– (inter)blocage possible !! (deadlock)• Un thread n’est pas bloqué par lui-même

– Ralentissement du code : attendre son tour

• Synchroniser juste ce qui est nécessaire

• Synchronisation– Méthode

– Bloc { } (statement)

des Threads ? Thread en Java AsyncTask Handler

Page 22: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 16 / 53

• Pas besoin de préciser sur quoi porte la synchronisation

• Tant qu’un thread est dans une méthode synchronisée, les autres threads sont bloqués sur les méthodes synchronisées de cet objet– À la fin de la méthode (« libération »), les autres threads sont prévenus

(des changements) (notion de "happens-before")

• Pas de règle sur l’héritage / surcharge

• Synchroniser une méthode statique => blocage de tout appel statique (sans lien avec les appels aux méthodes d’instance)

des Threads ? Thread en Java AsyncTask Handler

Page 23: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 17 / 53

• Il faut préciser l’objet de la synchronisationpublic void addName(String name) {

synchronized(this)

{

lastName = name;

nameCount++;

}

nameList.add(name);

}

Objet de la synchronisation

des Threads ? Thread en Java AsyncTask Handler

Page 24: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 18 / 53

Eligible pour

exécution

En cours d’exécution

Mort

Nouveau Thread

New Thread( )

start( )

Fin

Le système « passe »à ce thread

Bloqué

sleep / fin du délai

join / fin du thread rejoint

des Threads ? Thread en Java AsyncTask Handler

Page 25: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 18 / 53

Eligible pour

exécution

En cours d’exécution

Mort

Nouveau Thread

New Thread( )

start( )

Fin

Le système « passe »à ce thread

Bloqué

sleep / fin du délai

join / fin du thread rejoint

synchronized / son tour venu

des Threads ? Thread en Java AsyncTask Handler

Page 26: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 19 / 53

• Méthode wait (sur un objet)– objet.wait( );– Appel dans une section synchronisée– Possibilité d’attendre que quelque chose réveille le thread

• Le thread ne fait plus rien en attendant• Et il passe aussitôt la main

• Réveil par la méthode notify– objet.notify( );– Appel dans une section synchronisée– Ne débloque qu’un thread, on ne sait pas lequel

• Réveil par notifyAll( );

• Possibilité d’utiliser un délai max du wait( délai) – Dans ce cas, le thread doit gérer lui-même le fait de connaître la cause de son déblocage (notify ou temps

écoulé)

des Threads ? Thread en Java AsyncTask Handler

Page 27: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 20 / 53

// attendre tant qu’une condition // boucle pour ne pas rater un changement par un 3ième threadwhile (!condition) {

objet.wait();}

/* … */

// pour ne pas perdre deux notify consécutifs de 2 autres threadswhile (nbNotify < 2) {

wait();

}

des Threads ? Thread en Java AsyncTask Handler

Page 28: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 21 / 53

Eligible pour

exécution

En cours d’exécution

Mort

Nouveau Thread

New Thread( )

start( )

Fin

Le système « passe »à ce thread

Bloqué

sleep / fin du délai

join / fin du thread rejoint

synchronized / son tour venu

des Threads ? Thread en Java AsyncTask Handler

Page 29: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 21 / 53

Eligible pour

exécution

En cours d’exécution

Mort

Nouveau Thread

New Thread( )

start( )

Fin

Le système « passe »à ce thread

Bloqué

sleep / fin du délai

join / fin du thread rejoint

synchronized / son tour venu

wait / notify

des Threads ? Thread en Java AsyncTask Handler

Page 30: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 21 / 53

Eligible pour

exécution

En cours d’exécution

Mort

Nouveau Thread

New Thread( )

start( )

Fin

Le système « passe »à ce thread

Bloqué

sleep / fin du délai

join / fin du thread rejoint

synchronized / son tour venu

wait / notify

Le système « passe »à un autre thread

ou

Méthode static yield( )

Pour passer la main

des Threads ? Thread en Java AsyncTask Handler

Page 31: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 22 / 53

• Si on stoppe un thread il arrête de s’exécuter

• Il ne peut reprendre son exécution ; si on veut pouvoir suspendre et reprendre l’exécution du thread, voir suspend et resume

• stop() est deprecated car le thread stoppé peut laisser des objets dans un état inconsistant car il relâche leur moniteur quand il arrête son exécution

• On peut simuler stop en utilisant une variable

basé sur un transparent de Richard Grin

des Threads ? Thread en Java AsyncTask Handler

Page 32: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 23 / 53

/* canceled est une variable volatile et/ou modifiée dans des méthodes synchronisées

*/

public void run( ) {// codewhile( ! canceled) {

// code}

// code de fin du thread}

des Threads ? Thread en Java AsyncTask Handler

Page 33: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 24 / 53

• En cas de wait , sleep, etc.

• interrupt()

– met l’état du thread à « interrupted »

– Nous considérerons que c’est revenir à « en cours d’exécution », à ceci près qu’il faut gérer l’interruption…

des Threads ? Thread en Java AsyncTask Handler

Page 34: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 25 / 53

Eligible pour

exécution

En cours d’exécution

Mort

Nouveau Thread

New Thread( )

start( )

Fin

Le système « passe »à ce thread

Bloqué

sleep / fin du délai

join / fin du thread rejoint

synchronized / son tour venu

wait / notify

Le système « passe »à un autre thread

ou

Méthode static yield( )

Pour passer la main

des Threads ? Thread en Java AsyncTask Handler

Page 35: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 25 / 53

Eligible pour

exécution

En cours d’exécution

Mort

Nouveau Thread

New Thread( )

start( )

Fin

Le système « passe »à ce thread

Bloqué

Le système « passe »à un autre thread

ou

Méthode static yield( )

Pour passer la main

sleep / fin du délai

join / fin du thread rejoint

synchronized / son tour venu

wait / notify

? / interruption

suspend/ resume

des Threads ? Thread en Java AsyncTask Handler

Page 36: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 26 / 53

• priorité

• Happens-before

• Groupe de thread

• Collection & thread

• Fork / join

• etc.

des Threads ? Thread en Java AsyncTask Handler

Page 37: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 27 / 53

• Un sémaphore gère des ressources limitées• Blocage de haut niveau

– Création de bloc(s) « atomique(s) » « exclusif(s) »

• Avec des opérations (lock / unlock) atomiques– Lock pour bloquer la ressource– Unlock pour débloquer la ressource

• java.util.concurrent.locks.*;– Interface Lock : lock( ) et unlock( )– ReentrantLock– ReentrantReadWriteLock

des Threads ? Thread en Java AsyncTask Handler

Page 38: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 28 / 53

• Problème : lecture et écriture d’une liste simultané

– ConcurrentModificationException

– Peut arriver tout « seul » (parcours d’une collection et modification simultanée)

• Solution :

– Synchronisation

– Et/ou travail sur une copie puis recopie « totale »

des Threads ? Thread en Java AsyncTask Handler

Page 39: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 29 / 53

Certaines actions prennent du temps, elles figeraient l’application (UI).

Certaines actions sont interdites (car longues ou bloquantes) dans l’application

AsyncTask

Handler & HandlerThread, CoutDownTimer

java.util.concurrent.ScheduledThreadPoolExecutor (plutôt que java.util.Timer)

Un peu d’anglais ☺

des Threads ? Thread en Java AsyncTask Handler

Page 40: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 30 / 53

• Utilisation de « worker » (AsyncTask)

• Exemple : adresse vers coordonnées (nominatim) puis image (openstreetmap)

• V1 : l’intention, qui ne fonctionne pas

• V2 : une AsyncTask pour l’adresse

• V3 : évolution pour charger aussi l’image

des Threads ? Thread en Java AsyncTask Handler

Page 41: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 31 / 53

• Classes fourni dans java.net

URL siteUrl = new URL(url);

URLConnection conn = siteUrl.openConnection();

// on peut vouloir suivre les redirections…

// HttpURLConnection.setFollowRedirects(true);

// ensuite on a l’InputStream… conn.getInputStream()

// à encapsuler selon ce qu’on reçoit

// par exemple du JSON / text / etc.

BufferedReader in = new BufferedReader(new InputStreamReader( conn.getInputStream(), "UTF-8"));

// lecture tant qu’il y a à lire

while ((line = in.readLine()) != null) { file += line; }

// à la fin, file (une String) contient le fichier distant

in.close();

• Alternative : package d’apache intégré dans android

– http://developer.android.com/reference/org/apache/http/package-summary.html

– package org.apache.http

des Threads ? Thread en Java AsyncTask Handler

Page 42: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 32 / 53

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="adresseverscoordonnees.three"android:versionCode="1"android:versionName="1.0" >

<uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="25" />

<uses-permission android:name="android.permission.INTERNET" />

<application …

des Threads ? Thread en Java AsyncTask Handler

Page 43: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 33 / 53

• Il faut le « parser »– http://developer.android.com/reference/org/json/package-summary.html

// on reçoit un json qui contient un tableau d’objetJSONArray fileJson= new JSONArray(file);

// si le tableau n’est pas videif ((fileJson != null) && (fileJson.length() > 0)) {

// on prend le premier élément, qui est supposé être un objetJSONObject adresseRetournee = (JSONObject) fileJson.get(0);result = new Object[2];// on retrouve la propriété « lat » de cette objetresult[0] = (String) adresseRetournee.get("lat") ;// etc.

}

des Threads ? Thread en Java AsyncTask Handler

Page 44: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 34 / 53

• Impossible à savoir…

• Risque de figer l’interface graphique (et l’application)…

• … mais de toutes façons, depuis 3.x, il est interdit de faire certaines choses dans le thread graphique…

• Donc, il faut faire autrement– Il faut un thread,

– qui puisse faire des choses dans le graphique, plus facilement que la méthode runOnUiThread(Runnable) de la classe Activity

– bref un « Worker »

des Threads ? Thread en Java AsyncTask Handler

Page 45: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 35 / 53

• http://developer.android.com/reference/android/os/AsyncTask.html

• AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.

• AsyncTask is designed to be a helper class around Thread and Handler and does not constitute a generic threading framework. AsyncTasks should ideally be used for short operations (a few seconds at the most.)

• If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs provided by the java.util.concurrent pacakge

des Threads ? Thread en Java AsyncTask Handler

Page 46: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 36 / 53

• An asynchronous task is defined by a computation that runs on a background thread and whose result is published on the UI thread.

• An asynchronous task is defined by 3 generic types, called Params, Progress and Result, and 4 steps

des Threads ? Thread en Java AsyncTask Handler

Page 47: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 37 / 53

public class Tache extends AsyncTask<String, String, Object[]> {

// [...] // attributs de la classe

public Tache(TextView lat, TextView lon, ImageView img) {

// constructeur pour obtenir des élémentts

// par exemple graphique, pour mise à jour...

}

@Override

protected Object[] doInBackground(String... params) { // lancer par execute()

// tester les paramètres

if ((params == null)|| (params.length != 2)) return null;

Object [] result = null;

String url = params[0];

// [...] // utilise publishProgress(“<string>");

return result;

}

@Override

protected void onProgressUpdate(String... result){

// [...] // pour montrer la progression // appelé par publishProgress

}

@Override

protected void onPostExecute(Object [] res){

// traitement des résultats... // [...] // appelé à la fin de doInBackground

}

}

des Threads ? Thread en Java AsyncTask Handler

Page 48: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 38 / 53

• Création (new)• Appel à execute()

1. onPreExecute(), invoked on the UI thread before the task is executed. Setup / Graphical initialization (progress bar)

2. doInBackground(Params...), invoked on the background thread immediately after onPreExecute()This step is used to perform background computation that can take a long time. The result of the computation must be returned by this step and will be passed back to the last step.

3. onProgressUpdate(Progress...), invoked on the UI thread after a call to publishProgress(Progress...) from doInBackground. The timing of the execution is undefined. For user feedback.

4. onPostExecute(Result), invoked on the UI thread after the background computation finishes. The result of the background computation is passed to this step as a parameter.

des Threads ? Thread en Java AsyncTask Handler

Page 49: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 39 / 53

• Cancel : cancel(boolean). – isCancelled() return true. – onCancelled(Object) instead of onPostExecute– checking isCancelled() periodically in doInBackground(Object[])

• The AsyncTask class must be loaded on the UI thread. • The task instance must be created on the UI thread.• execute(Params...) must be invoked on the UI thread.• Do not call onPreExecute, onPostExecute,

doInBackground, onProgressUpdate manually.• The task can be executed only once

des Threads ? Thread en Java AsyncTask Handler

Page 50: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 40 / 53

• Starting with HONEYCOMB, tasks are executed on a single thread to avoid common application errors caused by parallel execution.

• If you truly want parallel execution, you can invoke executeOnExecutor(java.util.concurrent.Executor,

Object[]) withTHREAD_POOL_EXECUTOR.

des Threads ? Thread en Java AsyncTask Handler

Page 51: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 41 / 53

• Similaire à java

– http://developer.android.com/guide/components/processes-and-threads.html

– Pensez à onResume / onPause et onRestart / onStop, etc.

• Ou lié à des services

– http://developer.android.com/guide/components/services.html

des Threads ? Thread en Java AsyncTask Handler

Page 52: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 42 / 53

• Tache a besoin

– D’éléments graphiques pour les mettre à jour

– D’une url, d’un message par défaut

• Tache retourne

– Des coordonnées (latitude, longitude)

– Une image (enfin, si c’est ok)

• Publication de l’avancement : du texte

des Threads ? Thread en Java AsyncTask Handler

Page 53: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 43 / 53

• On recherche un json

– C.f; exemple ci-dessus

• On recherche une image

– Création d’une Bitmap à partir d’un InputStream

• Pour les résultats

– Appels à des setters

– Mise à jour avec invalidate( )

– Masquer / montrer l’image

des Threads ? Thread en Java AsyncTask Handler

Page 54: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 44 / 53

Attend

Exécute

Looper

Permet de poster ou d’envoyer des messages

(file d’attente)

Handler

Le Main Thread est un Looper

C’est le Looper par défaut

Looper.getMainLooper()

Messages d’autres threadsMessages

d’autres threadsMessages d’autres threads

des Threads ? Thread en Java AsyncTask Handler

Page 55: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 45 / 53

• Handler handler = new Handler()– En paramètre, un Looper est possible, c.f. HandlerThread– Par défaut Looper = Main Thread

• Utilisable « de partout »– Exécution sur le Looper Thread – Par défaut sur le Main Thread

• handler.post(Runnable)– postAtFrontOfQueue– postDelayed avec un second paramètre un délai (long, en ms)– postAtTime avec un second paramètre un temps (long, en ms)

• Date, System.uptimeMillis()+ …

• handler.removeCallbacks(r)– Garder une référence vers le Runnable r– Si pas encore exécuté, pas lancé ; sinon, c’est trop tard

des Threads ? Thread en Java AsyncTask Handler

Page 56: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 46 / 53

• Plutôt que poster des Runnable, envoyer des messages– Tâches connues à l’avance– Economie en mémoire (moins d’objet)

• Message– http://developer.android.com/reference/android/os/Message.html

– Des champs publics (facile d’accès)– Avec un « id » : message.what– Avec des données

• get/setData => un Bundle• ou int .arg1 / .arg2 et Object obj

• Création par fabrique– Message.obtain– avec différents paramètres : handler (pour le champ replyTo), what, arg1, arg2, obj– Ex: Message.obtain(handler, 42, "réponse à la grande question sur la vie, l'univers et le reste");

des Threads ? Thread en Java AsyncTask Handler

Page 57: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 47 / 53

• Pour envoyer sendMessage

– sendMessage

– sendMessageAtFrontOfQueue

– sendMessageDelayed avec un second paramètre un délai (long, en ms)

– sendMessageAtTime avec un second paramètre un temps (long, en ms)

• Variante avec sendEmptyMesssage(int what)

• Pour annuler (si pas encore traité) : removeMessage(int what)

– Car message recyclé dans la fabrique

des Threads ? Thread en Java AsyncTask Handler

Page 58: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 48 / 53

• Délégation à un Handler.Callback– handleMessage(Message msg)– En paramètre du constructeur du Handler (seul ou après le looper)

• Surcharge de la méthode handleMessage(Message msg)– Appelé par défaut par le Looper– Appel par défaut (si pas surchargée) le Handler.Callback– Déclaration en classe à part entière (ou en classe static) pour éviter un

nettoyage mémoire intempestif

• Possible de combiner les deux – dans la méthode surchargée handleMessage, appel à super.

handleMessage

des Threads ? Thread en Java AsyncTask Handler

Page 59: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 49 / 53

• Méthode post de View

– view.post(new Runnable() { /* … */ } );

• Méthode runOnUiThread de Activity

des Threads ? Thread en Java AsyncTask Handler

Page 60: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 50 / 53

• HandlerThread fournit un Looper (caché)// création du HandlerThread, avec un priorité basse pour ne

// pas surcharger le système

HandlerThread encapsuleLooper =

new HandlerThread("un nom", Process.THREAD_PRIORITY_BACKGROUND);

encapsuleLooper.start(); // obligatoire !

// création du handler

Handler handler = new Handler( encapsuleLooper.getLooper() );

// les posts et messages seront traité sur encapsuleLooper

des Threads ? Thread en Java AsyncTask Handler

Page 61: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 51 / 53

• Classe Abstraite à compléter– onTick– onFinish

• Constructeur CountDownTimer(long millisInFuture, long countDownInterval) – millisInFuture : délai en ms pour la fin– countDownInterval : délai en ms pour évolution intermédiaire

• Utilise un handler– Sur le thread « principal »– Utilise sendMessageDelayed– Appel selon le temps restant

• onTick (long millisUntilFinished) s’il reste du temps• onFinish() à la fin (dépassement possible)

– Accès à tout ce qui est graphique

des Threads ? Thread en Java AsyncTask Handler

Page 62: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 52 / 53

• java.util.Timer et import java.util.TimerTask• Un Timer permet de planifier des tâches

– Comme un Handler • Il y a un thread (Looper) commun à tous les Timer

– Méthode(s) schedule ou scheduleAtFixedRate– Méthode cancel / purge

• Un TimerTask est un objet avec une méthode run– à étendre (classe anonyme ou pas)

• https://docs.oracle.com/javase/8/docs/api/java/util/Timer.htmlhttps://docs.oracle.com/javase/8/docs/api/java/util/TimerTask.html

des Threads ? Thread en Java AsyncTask Handler

Page 63: 1ère partie (thread en java) indépendant d’Android ...deptinfo.unice.fr/~renevier/POO/cours/03 - thread et UI et java et... · Philippe Renevier Gonin - L3 Informatique parcours

Philippe Renevier Gonin - L3 Informatique parcours Miage - POO s6 - Thread & Android 53 / 53

• 100% java : java.util.concurrent– http://developer.android.com/reference/java/util/concurrent/ScheduledT

hreadPoolExecutor.html

• Quand il y a plusieurs actions à « programmer »– À préférer à Timer (de java.util.Timer)– http://developer.android.com/reference/java/util/Timer.html

• Gère un « pool » de thread où exécuter les tâches (Callable<V> ou Runnable )– Méthodes schedule pour programmer à un temps donner

• Tâches exécutées le plus tôt possible une fois leur « heure » arrivée

– Méthodes submit pour le faire exécuter dès que possible

des Threads ? Thread en Java AsyncTask Handler