✈️ DIM - Android Avancé

✈️ DIM - Android Avancé

Maintenant que vous savez créer une application android simple, vous pourriez vous arrêter là et faire des applications juste en utilisant les connaissances basiques du framework.

Mais comme vous le savez, être un bon développeur c'est être un développeur efficace, qui fourni un travail maintenable par lui-même et par une équipe.

Note 📝: Sachez également que selon les recommandations de Google, les basiques de la programmation Android prennent environs 2 semaines a être maitrisés. Ce qui fait presque le double du temps que nous avons dans ce module. Donc pas de pression, vous n'allez pas tout maîtriser ni même comprendre, il faudra appliquer et s'entrainer.

Ce qui est nécessaire de faire dans une app

Dans une app, il y a de grands concepts qui tombent sous le sens :

  • La navigation
  • L'interface
  • Les données
  • L'interaction

Contrairement aux systèmes que vous avez vu avant, sur une app mobile native vous avez beaucoup, beaucoup plus de choix et de possibilités. Ce qui peut vite vous perdre en tant que développeur.

Android Jetpack 🚀

Allez faire un tour sur cette page :
https://developer.android.com/jetpack

Question 1 👉 Quel est l'interêt de Jetpack du point de vue d'un développeur ? Qu'est ce que la séparation des responsabilités ?
Question 2 👉 Quels sont les avantages, selon vous, d'avoir un code plus concis, plus court ? Les inconvénients ?

Concepts

Dans cette partie du cours, vous allez découvrir les manières recommandées de gérer les différents grands concepts d'Android et du développement mobile en général.

Note 📝 : Ce cours est particulièrement important puisqu'il vous permettra de réaliser le projet de fin de module. Mais surtout, il vous permet de devenir un développeur Android à la page, utilisant les dernières recommandations de Google, vous serez donc efficace (faire beaucoup, avec peu d'effort).

Jetpack

Avec Jetpack Google a réalisé plusieurs bibliothèques bien utiles nous permettant de rendre notre code plus réactif et moins complexe. Voici le lien de la documentation permettant d'implémenter les différentes bibliothèques.

Nous allons détailler quelle est l'utilité de chacun.

Jetpack comprend également tous les outils pour mettre en place les "Architectures Components"

Pourquoi les architectures components ?

Pourquoi Jetpack, pourquoi des architectures, pourquoi TOUT ?

Pour respecter les principes SOLID principalement, qui sont la bases des bonnes pratiques de programmation.

Mais alors pourquoi il y a des bonnes pratiques ? Pourquoi votre façon de faire serait mauvaise ?

Eh bien comme dans tout métier ou dans tout sport, il y a des gens depuis des décennies qui se pète le crane sur des problèmes, qui ont bossé toute leur vie dans un domaine qui en ont tiré des enseignements.

En développement, ces gens qui ont travaillé sur des projets gigantesques avec des centaines, voire des milliers de développeurs en même temps, ont accumulé une masse de connaissances collective énorme.

Consulter la sagesse des générations de développeurs qui vous ont précédés ici

Recueil de bonnes pratiques et conseil de développement
La sagesse des générations de développeurs qui vous ont précédés.Attention à l’Effet Dunning Krugerhttps://fr.wikipedia.org/wiki/Effet_Dunning-Kruger 🧐 Quelques bonnes pratiques comportementales pour un développeurComprenez et acceptez que vous allez faire des erreurs.Vous n’êtes pas votre code. Ra…

Qui au fil des années et à Internet ont permit de construire des "règles" qui vous facilitent la vie (dans le sens ou vous n'allez jamais tomber sur un problème non élucidé par d'autres auparavant).

Egalement cet article de CodeRanch qui est un bon recueil

JavaRanch - a friendly place for Java greenhorns - Programming Pearls

Gestion des données - ⚡️ L'accès au réseau

Votre application devra la plupart du temps accéder au réseau pour récupérer des données provenant d'une ou plusieurs API (web service). Il existe des centaines de manières de gérer cela sur Android.

Aller plus loin avec le réseau

Plus tard vous utiliserez des bibliothèques comme Retrofit qui vont vous permettre d'implémenter des API comme des reflets du serveur (on appelle cela de l'API Mapping, c'est Retrofit qui construira vos requêtes en utilisant le "HTTP Client" de votre choix et l'outil de "Content negociation" de votre choix.

Retrofit + MVVM + LiveData + DataBinding et vous avez presque l'architecture parfaite :)

Retrofit à quoi ca sert ?

A gagner en robustesse de code, en propreté et en réutilisation.

Sans Retrofit (Pure OkHttp)

fun sendNetworkRequestOkHttp(){
        val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build()
        val adapter = moshi.adapter(Position::class.java)
        val mediaTypeJson = "application/json; charset=utf-8".toMediaType()
        adapter.toJson(position)?.let {
            val client = OkHttpClient()
            val body = it.toRequestBody(mediaTypeJson)
            val url = with(HttpUrl.Builder()) {
                scheme("http")
                host("10.0.2.2")
                port(8080)
                addPathSegments("/position/register")
                addQueryParameter("userId", userId)
                build()
            }
            val request = with(Request.Builder()) {
                post(body)
                url(url)
                addHeader("Content-Type", "application/json")
                build()
            }

            client.newCall(request).enqueue(responseCallback = object : Callback {
                override fun onFailure(call: Call, e: IOException) {
                    Timber.e("Exception when calling network ${e.message}")
                }

                override fun onResponse(call: Call, response: Response) {
                    Timber.d("Server response : ${response.body}")
                }

            })
}

La même chose avec Retrofit


interface PositionService {
    @Headers("Content-Type:application/json")
    @POST("/position/register")
    suspend fun registerPosition(
        @Query("userId") userId: String,
        @Body position: Position
    ): Response<String>
}

Je pense que c'est assez parlant.

Pour apprendre à utiliser Retrofit, réalisez le TP suivant : Utilisation de Retrofit par l'exemple


Les 2 parties suivantes sont bonus car non nécessaire à la réalisation du projet final de ce Workshop Android, mais ils feront l'objet de points bonus si vous les réalisez.

(Bonus) Gestion des données - 🤟 Room

Il existe plusieurs façons de stocker des données sur Android, qui sont comparées et expliquées ici : https://developer.android.com/training/data-storage

(Bonus) MVVM + LiveData + Room + Retrofit = 🚀

Vous connaissez enfin (presque) tous les composants, pour les mettre en place ensemble, Google propose une architecture qui permet d'abstraire au maximum chaque responsabilité de vos composants :

Maintenant que vous êtes des pros du développement natif, vous pouvez combiner votre travail sur le réseau (via l'API Rick&Morty) et vos connaissances sur l'ORM Room pour créer une application mvvm + retrofit + livedata + room ! 😎