Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Les Coroutines et les Cycles de Vie Android - L...

Les Coroutines et les Cycles de Vie Android - Les Deux Font la Paire

L'arrivée des coroutines en accompagnement de Kotlin nous a apporté un nouvel outil pour gérer les opérations concurrentes sur Android. Les avantages de la syntaxe simple et d'une API complète et fluide sont séduisants pour les développeurs. Cependant, l'ajout du "CoroutineScope" a introduit une complexité supplémentaire dans leur utilisation, sans pour autant que tous les développeurs soient immédiatement convaincus par sa valeur ajoutée.

La notion de "Structured Concurrency" sert à construire des hiérarchies de tâches et à coordonner leur annulation, leur terminaison, et leur échec. C'est un mécanisme qui se marie parfaitement avec le cycle de vie des composants Android. Nous verrons donc ensemble comment mettre cet outil en application pour maitriser l'execution de tâches au sein d'une application Android. Avec quelques fondamentaux de coroutines et les outils des bibliothèques AndroidX, nous verrons comment tirer au mieux profit des coroutines.

Présenté à "Kotlin/Everywhere GDG Trip @Paug" en septembre 2019.

https://www.meetup.com/Android-Paris/events/263548582

Martin Devillers

September 12, 2019
Tweet

More Decks by Martin Devillers

Other Decks in Programming

Transcript

  1. ANDROID LIFECYCLE CYCLES DE VIE ANDROID ▸ Composants Android ▸

    Activités ▸ Services ▸ Fragments ▸ Application process ▸ ViewModel
  2. ANDROID LIFECYCLE ANDROIDX LIFECYCLE public interface LifecycleOwner { @NonNull Lifecycle

    getLifecycle(); } public abstract class Lifecycle { public abstract void addObserver( LifecycleObserver observer ); public abstract void removeObserver( LifecycleObserver observer ); public abstract Lifecycle.State getCurrentState(); public enum Event { ON_CREATE, ON_START, ON_RESUME, ON_PAUSE, ON_STOP, ON_DESTROY, ON_ANY } public enum State { DESTROYED, INITIALIZED, CREATED, STARTED, RESUMED; public boolean isAtLeast(Lifecycle.State state) { return compareTo(state) >= 0; } } }
  3. ANDROID LIFECYCLE IMPLÉMENTATIONS DE LIFECYCLEOWNER#GETLIFECYCLE ▸ AppCompatActivity#getLifecycle ▸ LifecycleService#getLifecycle ▸

    Fragment#getLifecycle ▸ FragmentViewLifecycleOwner#getLifecycle ▸ Fragment#getViewLifecycleOwner ▸ ProcessLifecycleOwner#getLifecycle ▸ ProcessLifecycle#get()
  4. COROUTINE SCOPE COROUTINE SCOPE & COROUTINE CONTEXT ▸ Dispatcher ▸

    Job ▸ Uncaught Exception Handler ▸ Name ▸ … (custom)
  5. COROUTINE SCOPE COROUTINE SCOPE & COROUTINE BUILDERS val job =

    coroutineScope.launch { /*  */ } val deferred = coroutineScope.async { /*  */ }
  6. LIFECYCLE COROUTINE SCOPE SCOPE LIÉ À UN CYCLE DE VIE

    ▸ Lifecycle#coroutineScope ▸ SupervisorJob ▸ ⚠ Dispatchers.Main.immediate (changé de Dispatchers.Main depuis alpha04) ▸ Le Job ne sera actif que tant que le cycle de vie est au minimum dans l’état Initialized ▸ Il est ensuite annulé
  7. LIFECYCLE COROUTINE SCOPE AJOUTS SUR LIFECYCLECOROUTINESCOPE ▸ Pour se lier

    à un autre état minimum du lifecycle ▸ launchWhenCreated ▸ launchWhenStarted ▸ launchWhenResumed ▸ Utilisent un dispatcher dédié ▸ Tourne sur le thread principal ▸ Suspend tant qu’on n’est pas dans l’état minimum
  8. VIEWMODEL COROUTINESCOPE SCOPE DE VIEWMODEL ▸ ViewModel#lifecycleScope ▸ Actif tant

    que onClear n’a pas été appelé sur le ViewModel ▸ Ensuite annulé
  9. LES COROUTINES NE DEVRAIENT UNIQUEMENT DÉPENDRE D’AUTRES COROUTINES QUI ONT

    UN PÉRIMÈTRE D’ACTIVITÉ PLUS LARGE Martin Devillers, le 12/09/2019 LIFECYCLE COROUTINE SCOPE
  10. TEXT RÉFÉRENCES ▸ Handling Lifecycles with Lifecycle-Aware Components ▸ Use

    Kotlin coroutines with Architecture components ▸ Coroutines on Android (part II): Getting started ▸ Easy Coroutines in Android: viewModelScope ▸ Source (GitHub)