2017-09-19 19 views
0

Devrais-je mettre en cache les objets générés par Retrofit ou est-il recommandé de créer à la volée?Est-ce une bonne pratique de conserver les instances Retrofit en mémoire?

Je commence une migration progressive d'un ancien framework de réseau à Retrofit qui a démarré avec une logique très basique pour mettre en cache les instances créées par Retrofit. Cela est dû à notre architecture qui utilisera différents critères d'évaluation dans différentes activités/Fragments, cette méthode sera appelée comme la visite d'utilisateur différentes parties de l'application:

static public <T> T getApi(Class<T> apiInterface) { 
    validateInitialization("getApi()"); 

    if (!mApis.containsKey(apiInterface.getSimpleName())) { 
    mApis.put(apiInterface.getSimpleName(), retrofit().create(apiInterface)); 
    } 

    return (T) mApis.get(apiInterface.getSimpleName()); 
} 

Cependant, comme nous continuons de migrer nos schémas à utiliser Rénovation, cette carte augmente en taille (actuellement environ 20 interfaces/API différentes peuvent être créées) et contient parfois des instances qui ne sont plus utilisées.

+0

singleton avec dagger2 et injecter si nécessaire. Est-ce que https://github.com/googlesamples/android-architecture-components/blob/master/GithubBrowserSample/app/src/main/java/com/android/example/github/di/AppModule.java aide? – Raghunandan

Répondre

2

Je dirais que la réponse est "ça dépend".

Il n'y a aucun inconvénient (que je suis conscient de) à la mise en cache de ces objets qui est inhérente à Retrofit; Ce n'est pas comme si ces objets de service étaient des drains massifs sur la vie de la batterie de l'appareil ou quelque chose de farfelu comme ça. Au lieu de cela, il s'agit de savoir quel inconvénient vous préférez éviter: la consommation potentielle de mémoire "supplémentaire" par des objets de service qui ne seront pas réutilisés, mais qui ne peuvent pas être collectés, ou la "lenteur" potentielle encourus en créant un nouvel objet de service pour chaque appel. La seule façon de choisir est d'analyser votre application et les comportements/préférences de vos utilisateurs, et de décider de quelle manière vous préférez aller.

Dans mon expérience personnelle, je ne me suis pas inquiété du coût de la création d'un nouvel objet de service à la volée. Je n'ai jamais remarqué de différence perceptible dans la vitesse de mes applications à cause de cela.

En général, je conseillerais de ne pas optimiser avant vous avez la preuve d'un problème. Je n'ai aucune preuve que Retrofit.create() est trop lent pour mes cas d'utilisation, donc je l'appelle à la volée à chaque fois.