uncle_bens1 Posté(e) 2 juillet 2012 Share Posté(e) 2 juillet 2012 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 More sharing options...
BapNesS Posté(e) 3 juillet 2012 Share Posté(e) 3 juillet 2012 GNex ROM ICS stock 4.0.4 : c'est fluide. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.