✈️ 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
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
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

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
(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
! 😎