# 2021-03-01 | Android | Base de données | Room ###### tags: `kotlin` `android` `gobelins` # Programmation multi thread * Les instructions exécutées dans un programme sont dans 1 thread * Généralement, les instructions s'éxecutent de manière séquentielle * On peut éxecuter plusieurs instructions parallèlement dans un multi thread ## Exécution synchrone Instructions éxecutées séquentiellement ## Exécution asynchrone Instructions éxecutées en parallèle ## En android ### Thread principal * Interface gérée par 1 thread (uiThread) * Seule thread qui modifie les élements de la vue et les interactions à l'utilisateur * Si 1 instruction bloque le thread, l'interface ne réagit plus ### Gestioin des threads * La gestion des threads est de la responsabilité du développeur * Android bloque certaines actions si elles s'éxecutent sur le thread principal * Les opérations I/O ne sont pas autorisés sur le thread principal (BDD, Internet) * Si les actions prennent plus de 1secondes, il ne faut pas le faire sur le thread principal ### Synchronisation des threads * Android permet de mettre automatiquement à jour l'interface à la fin d'une opération d'un thread secondaire * Requete http * BDD * Image from url ### Créer un thread ```kotlin= Executors.newSingleThreadExecutor().execute { // code } ``` Le code ci-dessous permet de repasser la min au thread principal (le seule à avoir la main sur l'interface) : ```kotlin= Executors.newSingleThreadExecutor().execute { // code runOnUiThread { Toast.makeText(baseContext, "On main thread", Toast.LENGTH_SHORT).show() } } ``` # Architecture component (librairies d'architecture) Ensemble de librairies permettant de structurer une application Android : * Robuste * Testable * Maintenable Permet de comprendre facilement l'application et son code : * Bonnes pratiques * Code propre * Réutilisation * Peu de dépendances * Faciliter la maintenance ## Base de données ### Classes et entités Ci dessous une classe : ```kotlin= class Person { val firstName: String val lastName: String } ``` Ci dessous une classe transformée en entité pour la bdd : ```kotlin= @Entity class Person { @PrimaryKey (autogenerate = true) val id: UUID @ColumnInfo(name = "first_name") val firstName: String? @ColumnInfo(name = "last_name") val lastName: String } ``` Tout les champs doivent être public ou avoir un getter pour permettre à Room d'y accéder. ### Relations // plus tard link in andorid.com => reference/android/arch/persistence/room/package-summary