J'ai un problème d'optimisation avec mon application. Plus particulièrement une ExpandListView. Je trouve que l'animation de scroll est plutôt lente voir très laguée par rapport à ce qu'on peut trouver sur d'autres applications... J'ai déjà fait un grand nombre d'optimisations mais je me heurte à un manque d'idées et aussi à un manque d'expérience pour trouver des nouvelles pistes d'optimisations et ainsi avoir un scroll fluide...
Ce que j'ai déjà fait : Prémièrement, j'ai commencer par créer une CustomView héritant de View, j'ai vu dans les logs qu'il y avait un grand nombre de GC donc j'ai utilisé le "allocation tracker" de DDMS dans le but de comprendre quels étaient mes objets qui pouvaient causer tous ces GC. J'ai donc identifié un grand nombre d'instanciations de String. J'ai donc modifié mon modèle dans le but de ne charger ces String qu'une fois (car j'en ai max 600). J'ai aussi créer un objet réutilisable correspondant à une instruction de paint dans le but de stocker à passer directement dans mes instructions pendant la méthode draw.
Dans le but de vous donner toutes les informations pour comprendre mon problème voici un peu de fonctionnel :
Mon application est une application qui vous donne les séances de cinéma proche de votre prosition. La liste expand montre les informations suivantes :
Name Cinema : [Image]
distance
-->Movie Name 1 : time
passed time 1 | passed time 2 | nearest time |
futur time 1 | futur time 2
-->Movie Name 2 : time
passed time 1 | passed time 2 | nearest time |
futur time 1 | futur time 2
etc.
Comme vous pouvez le voir, sous chaque film, je liste l'ensemble des séances pour un cinéma et j'ai un formatage différent dépendant de l'heure courante.
En terme de modèle d'objets j'ai la structure suivante dans mon adapter :
ArrayList theaterList; // The list of my cinema HashMap mapMovie; // An hashmap which gives me the movie corresponding to an id
Le problème que je rencontre est que si je regarde les logs après ces optimisations, j'ai toujours un nombre très important de GC.... et quand je regarde l'allocation tracker, j'ai ça :
En première position vient android.graphic.Bitmap de la méthode nativeCreate :
En second vient android.widget.ExpandableListPosition de la méthode getRecycleCreateandroid.graphics.Bitmap nativeCreate Bitmap.java -2 true
android.graphics.Bitmap createBitmap Bitmap.java 477 false
android.view.View buildDrawingCache View.java 6599 false
android.view.View getDrawingCache View.java 6450 false
android.view.ViewGroup drawChild ViewGroup.java 1571 false
android.view.ViewGroup dispatchDraw ViewGroup.java 1373 false
android.widget.AbsListView dispatchDraw AbsListView.java 1545 false
android.widget.ListView dispatchDraw ListView.java 3138 false
android.widget.ExpandableListView dispatchDraw ExpandableListView.java 229 false
android.view.View draw View.java 7008 false
android.widget.AbsListView draw AbsListView.java 2669 false
android.view.ViewGroup drawChild ViewGroup.java 1646 false
android.view.ViewGroup dispatchDraw ViewGroup.java 1373 false
android.view.ViewGroup drawChild ViewGroup.java 1644 false
android.view.ViewGroup dispatchDraw ViewGroup.java 1373 false
android.view.ViewGroup drawChild ViewGroup.java 1644 false
Après j'ai beaucoup de java.lang.ref.SoftReference venant de buildDrawingCache :android.widget.ExpandableListPosition getRecycledOrCreate ExpandableListPosition.java 121 false
android.widget.ExpandableListPosition obtain ExpandableListPosition.java 107 false
android.widget.ExpandableListConnector$PositionMetadata obtain ExpandableListConnector.java 988 false
android.widget.ExpandableListConnector getUnflattenedPos ExpandableListConnector.java 176 false
android.widget.ExpandableListConnector getItemViewType ExpandableListConnector.java 464 false
android.widget.AbsListView$RecycleBin getScrapView AbsListView.java 4603 false
android.widget.AbsListView obtainView AbsListView.java 1465 false
android.widget.ListView makeAndAddView ListView.java 1745 false
android.widget.ListView fillDown ListView.java 670 false
android.widget.ListView fillGap ListView.java 641 false
android.widget.AbsListView trackMotionScroll AbsListView.java 3497 false
android.widget.AbsListView$FlingRunnable run AbsListView.java 2994 false
android.os.Handler handleCallback Handler.java 587 false
android.os.Handler dispatchMessage Handler.java 92 false
android.os.Looper loop Looper.java 130 false
android.app.ActivityThread main ActivityThread.java 3835 false
Pour résumer pour mes 512 allocations :android.view.View buildDrawingCache View.java 6602 false
android.view.View getDrawingCache View.java 6450 false
android.view.ViewGroup drawChild ViewGroup.java 1571 false
android.view.ViewGroup dispatchDraw ViewGroup.java 1373 false
android.widget.AbsListView dispatchDraw AbsListView.java 1545 false
android.widget.ListView dispatchDraw ListView.java 3138 false
android.widget.ExpandableListView dispatchDraw ExpandableListView.java 229 false
android.view.View draw View.java 7008 false
android.widget.AbsListView draw AbsListView.java 2669 false
android.view.ViewGroup drawChild ViewGroup.java 1646 false
android.view.ViewGroup dispatchDraw ViewGroup.java 1373 false
android.view.ViewGroup drawChild ViewGroup.java 1644 false
android.view.ViewGroup dispatchDraw ViewGroup.java 1373 false
android.view.ViewGroup drawChild ViewGroup.java 1644 false
android.view.ViewGroup dispatchDraw ViewGroup.java 1373 false
android.view.ViewGroup drawChild ViewGroup.java 1644 false
67 sont pour : android.graphics.Bitmap
300 sont pour : android.widget.ExpandableListPosition
81 sont pour : java.lang.ref.SoftReference ET java.lang.ref.WeakReference
Donc, je n'ai aucune idée de comment résoudre mon problème... Si vous avez un mobile récent, vous ne verrez probablement pas le lag dont je parles. Pour mes tests, j'utilise un SGS. Mais déjà avec l'émulateur on observe tous les GCs
Tout le code de mon appli est dispo ici :
https://github.com/binomed/CineShowT...ubViewNew.java pour les child view
https://github.com/binomed/CineShowT...asterView.java pour les group view
https://github.com/binomed/CineShowT...ltAdapter.java pour l'adpater (C'est une classe utilitaire mais on retrouve les mêmes méthodes que pour un ExpandBaseAdapter)
La version du market n'a que l'optimisation de la CustomView :https://play.google.com/store/apps/d...nNob3d0aW1lIl0.
Je suis ouvert à toutes propositions qui pourrait m'aider à rendre mon appli plus rapide
Si vous avez des questions n'hésitez pas.
Cdlt
Partager