Aller au contenu

Comment optimiser ma vue pour avoir un scroll rapide ?


uncle_bens1

Recommended Posts

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 :

android.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

En second vient android.widget.ExpandableListPosition de la méthode getRecycleCreate

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

Après j'ai beaucoup de java.lang.ref.SoftReference venant de buildDrawingCache :

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

Pour résumer pour mes 512 allocations :

  • 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/CineShowTime-Android/blob/master/Libraries/CineShowTime/src/com/binomed/showtime/android/layout/view/ObjectSubViewNew.java pour les child view

https://github.com/binomed/CineShowTime-Android/blob/master/Libraries/CineShowTime/src/com/binomed/showtime/android/layout/view/ObjectMasterView.java pour les group view

https://github.com/binomed/CineShowTime-Android/blob/master/Libraries/CineShowTime/src/com/binomed/showtime/android/adapter/view/AbstractResultAdapter.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/details?id=com.binomed.showtime&feature=search_result#?t=W251bGwsMSwyLDEsImNvbS5iaW5vbWVkLnNob3d0aW1lIl0.

Je suis ouvert à toutes propositions qui pourrait m'aider à rendre mon appli plus rapide :)

Si vous avez des questions n'hésitez pas.

Cdlt

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...