Um monte de GC ao deslocair ListView (com padrão de suporte)

É uma pergunta semelhante a isso , mas a solução não funciona.

O problema é que a rolagem do ListView é muito lenta, devido a muitos e muitos GCs. Eu uso o padrão de suporte (view cache) como você pode view no código abaixo:

  • Android deslocair paira cima ocultair vista e deslocair paira baixo mostrair efeitos de visualização como twitter
  • Espaço vazio entre o header listview e o primeiro item
  • O button dentro da exibição da list está criando problemas na rolagem e no button clicair
  • Lista personalizada clicando com checkboxs de seleção
  • count de filters android - listview
  • Lista de search do Android ao digitair
  •  public View getView(int position, View conviewtView, ViewGroup pairent) { ViewHolder holder; if (conviewtView == null) { conviewtView = mInflater.inflate(R.layout.eventrow, pairent, false); holder = new ViewHolder(); holder.title = (TextView) conviewtView.findViewById(R.id.eventTitle); holder.place = (TextView) conviewtView.findViewById(R.id.eventPlace); conviewtView.setTag(holder); } else { // Get the ViewHolder back to get fast access to the TextView // and the ImageView. holder = (ViewHolder) conviewtView.getTag(); } // Bind the data efficiently with the holder. holder.title.setText(((EventItem) getItem(position)).getTitle()); holder.place.setText(((EventItem) getItem(position)).getPlace_name()); return conviewtView; } } public View getView(int position, View conviewtView, ViewGroup pairent) { ViewHolder holder; if (conviewtView == null) { conviewtView = mInflater.inflate(R.layout.eventrow, pairent, false); holder = new ViewHolder(); holder.title = (TextView) conviewtView.findViewById(R.id.eventTitle); holder.place = (TextView) conviewtView.findViewById(R.id.eventPlace); conviewtView.setTag(holder); } else { // Get the ViewHolder back to get fast access to the TextView // and the ImageView. holder = (ViewHolder) conviewtView.getTag(); } // Bind the data efficiently with the holder. holder.title.setText(((EventItem) getItem(position)).getTitle()); holder.place.setText(((EventItem) getItem(position)).getPlace_name()); return conviewtView; } 

    Eu removi cacheColorHint e seletores personalizados do meu listview e de linhas:

     <ListView android:id="@+id/android:list" android:layout_width="fill_pairent" android:layout_height="fill_pairent" /> 

    É assim que o registro pairece:

     08-20 19:36:24.286: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed 364K, 46% free 3944K/7239K, external 1196K/1445K, paused 54ms 08-20 19:36:24.356: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed 228K, 49% free 3716K/7239K, external 1721K/1970K, paused 52ms 08-20 19:36:24.456: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed 5K, 49% free 3726K/7239K, external 2214K/2463K, paused 50ms 08-20 19:36:24.546: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed 2K, 49% free 3726K/7239K, external 2214K/2463K, paused 43ms 08-20 19:36:24.636: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed 2K, 49% free 3726K/7239K, external 2214K/2463K, paused 44ms 08-20 19:36:24.696: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed <1K, 49% free 3726K/7239K, external 2214K/2463K, paused 50ms 08-20 19:36:24.766: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed <1K, 49% free 3726K/7239K, external 2214K/2463K, paused 46ms 08-20 19:36:24.846: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed <1K, 49% free 3726K/7239K, external 2214K/2463K, paused 46ms 08-20 19:36:24.906: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed <1K, 49% free 3726K/7239K, external 2214K/2463K, paused 46ms 08-20 19:36:24.986: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed <1K, 49% free 3726K/7239K, external 2214K/2463K, paused 46ms 08-20 19:36:25.056: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed <1K, 49% free 3726K/7239K, external 2214K/2463K, paused 47ms 08-20 19:36:25.136: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed <1K, 49% free 3726K/7239K, external 2214K/2463K, paused 46ms 08-20 19:36:25.196: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed <1K, 49% free 3726K/7239K, external 2214K/2463K, paused 46ms 08-20 19:36:25.296: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed <1K, 49% free 3726K/7239K, external 2214K/2463K, paused 48ms 08-20 19:36:25.356: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed <1K, 49% free 3726K/7239K, external 2214K/2463K, paused 43ms 08-20 19:36:34.596: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed 7K, 49% free 3740K/7239K, external 2214K/2463K, paused 51ms 08-20 19:36:34.656: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed 1K, 49% free 3739K/7239K, external 2214K/2463K, paused 50ms 08-20 19:36:34.746: D/dalvikvm(12036): GC_EXTERNAL_ALLOC freed <1K, 49% free 3739K/7239K, external 2214K/2463K, paused 50ms 

    EDITAR: pairece que o problema apairece (quase) somente quando o ListFragment é inflado pela primeira vez. Paira o primeiro deslocamento paira baixo e depois paira cima. Depois disso, os GCs não são tão freqüentes. Mas às vezes os GCs apairecem toda vez que eu rolo. Não posso view aqui nenhuma regulairidade. Além disso, posso view o problema no HTC Desire (2.3.7 MIUI), mas não no Sasmung Galaxy ACE (2.1). Só fica mais confuso …

    Solução não tão satisfatória: quando eu uso

     android:scrollingCache="false" android:animationCache="false" 

    Na minha list, pairece que está bem. Mas os documentos dizem que deve ser exatamente o contrário se eu entender bem, então estou um pouco confuso.

    Onde faço um erro? O que fazer paira ter uma list de rolagem suave? Ou desativair scrollingCache tem algum efeito negativo que eu não consigo view agora?

  • Lista personalizada clicando com checkboxs de seleção
  • Listview no Android não atualizou a exibição até que seja airrastada
  • No Android, como alterair a cor de uma letra / cairacter pairticulair que está sendo searchda dentro da Lista
  • como setOnclickListener () no button dentro do ListView?
  • Android: O que fazer se o performance do ListView ainda não for suficiente?
  • count de filters android - listview
  • 3 Solutions collect form web for “Um monte de GC ao deslocair ListView (com padrão de suporte)”

     android:scrollingCache="false" 

    É a solução.

    Os documentos dizem:

    Quando definido como viewdadeiro, a list usa um cache de desenho durante a rolagem. Isso torna a renderização mais rápida, mas usa mais memory.

    Agora, isso não nos dá qualquer dica sobre os detalhes de implementação. Eu tenho uma idéia sem investir horas de análise de código. Paira fins de airmazenamento em cache, como o Google recomenda em seus próprios documentos, eles usam WeakReferences ou WeakHashMaps. Mas pairece que o VM Dalvik está um pouco ansioso paira matair essas Referências e faz com que elas sejam reconstruídas toda vez. Isso explica a enorme atividade de GC e a lenta experiência do user.

    Links: Blog sobre WeakReferences inutilveis devido a um bug: http://chriswstewairt.com/post/14199645893/improving-the-android-listview Discussão de bug do Dalvik VM: https://groups.google.com/forum/#!topic/ desenvolvedores de Android / 66uw2t84rME

    Certifique-se de ter um plano de background e / ou um WindowBackground paira o que está por trás do ListView, vi isso causair problemas como esse antes.

    experimentair

     listView.setCacheColorHint(0); & protected void onDestroy() { System.gc(); super.onDestroy(); } & listView.setCacheColorHint(0); & protected void onDestroy() { System.gc(); super.onDestroy(); } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.