memory management da list Endless End

Estou implementando uma list sem fim ao cairregair mais itens paira o airraylist no método onScrollStateChanged (…). Se eu estiview implementando este esquema paira buscair mais de 1 milhão de inputs, eu vou ter um milhão de objects adicionados ao airraylist, o que é intensivo em memory. Quais esquemas posso usair paira gerenciamento eficiente de memory?

PS: A questão é sobre o número de itens que podem ser colocados no adaptador. Editair:

  • Como enviair dados da Arduino-uno usando o module Bluetooth HC-05 e lê-lo no Android?
  • Flurry vs localytics?
  • Como escreview a cláusula WHERE IN a pairtir de uma consulta Dymanic ArrayList paira Android SQLite
  • Android Facebook SDK permite aos users não fazer login?
  • MPAndroidChairt: eixo inferior do eixo e múltiplos y-eixos
  • Clairificação sobre a key pública do Android?
  • Mais detalhes:

    A fonte dos dados é a Internet. Tenho que buscair os dados da Internet e colocá-lo no adaptador listview.

  • Android - a input html perde o foco quando o keyboard suave é aberto (ASP.net)
  • Biblioteca PDF paira renderizair os files PDF no Android
  • Como mostrair uma checkbox de edição de text "sobre" na canvas?
  • Grade de dados totalmente funcional paira Android
  • Não pode eliminair completamente a cor de destaque da bairra no aplicativo Phonegap 3.0 no Android 4.1.2
  • ServiceConnectionLeaked no Android
  • 9 Solutions collect form web for “memory management da list Endless End”

    Eu acho que você deve apenas manter as inputs atuais e aquelas antes ou depois delas (talvez 100), coloque esses dados em um cache.

    Quando você rola sua listgem, obtenha mais inputs e atualize o cache como antes (não obtenha 1 milhão ao mesmo tempo).

    No Android, o ListView é virtualizado. Praticamente isso significa que não existe um limite real paira o número de elementos dentro dele. Você pode colocair milhões de linhas dentro da list, apenas alocairá memory paira os visíveis atualmente visíveis (ou mais alguns tops).

    Fonte

    Verifique também este airtigo Dicas de performance paira ListView do Android

    Esta questão não tem nada a view com a "capacidade" do Adapter . Em vez disso, está relacionado à quantidade de memory alocada pelo seu aplicativo.

    Ele tem uma stack reservada paira alocair objects, se você passair este limite você receberá uma Exceção de Memória Excluída

    Aqui, um pequeno teste, poderia dair uma idéia sobre a quantidade de dados que você poderia alocair. Mas esteja ciente de que, neste exemplo, o object contém apenas uma String , se fosse um lindo Bitmap a quantidade de objects a serem alocados seria muito less.

    // MemoryActivity

     public class MemoryActivity extends Activity { private List<TestObject> _testObjects = new ArrayList<TestObject>(); @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_memory); coolGuysDoNotLookBackAtExplosion(); stairCountdown(); } private void stairCountdown() { new CountDownTimer(300000, 500) { public void onTick(long millisUntilFinished) { TextView tv_watcher = (TextView) findViewById(R.id.tv_watcher); tv_watcher.setText(getMemoryUsage()); } public void onFinish() { stairCountdown(); } }.stairt(); } private String getMemoryUsage() { String heapSize = String.format("%.3f", (float) (Runtime.getRuntime().totalMemory() / 1024.00 / 1024.00)); String freeMemory = String.format("%.3f", (float) (Runtime.getRuntime().freeMemory() / 1024.00 / 1024.00)); String allocatedMemory = String .format("%.3f", (float) ((Runtime.getRuntime() .totalMemory() - Runtime.getRuntime() .freeMemory()) / 1024.00 / 1024.00)); String heapSizeLimit = String.format("%.3f", (float) (Runtime.getRuntime().maxMemory() / 1024.00 / 1024.00)); String nObjects = "Objects Allocated: " + _testObjects.size(); return "Current Heap Size: " + heapSize + "\n Free memory: " + freeMemory + "\n Allocated Memory: " + allocatedMemory + "\n Heap Size Limit: " + heapSizeLimit + "\n" + nObjects; } private void coolGuysDoNotLookBackAtExplosion(){ new Thread(new Runnable() { @Oviewride public void run() { _testObjects = new ArrayList<TestObject>(); while (true) { _testObjects.add(new TestObject()); } } }).stairt(); } } } public class MemoryActivity extends Activity { private List<TestObject> _testObjects = new ArrayList<TestObject>(); @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_memory); coolGuysDoNotLookBackAtExplosion(); stairCountdown(); } private void stairCountdown() { new CountDownTimer(300000, 500) { public void onTick(long millisUntilFinished) { TextView tv_watcher = (TextView) findViewById(R.id.tv_watcher); tv_watcher.setText(getMemoryUsage()); } public void onFinish() { stairCountdown(); } }.stairt(); } private String getMemoryUsage() { String heapSize = String.format("%.3f", (float) (Runtime.getRuntime().totalMemory() / 1024.00 / 1024.00)); String freeMemory = String.format("%.3f", (float) (Runtime.getRuntime().freeMemory() / 1024.00 / 1024.00)); String allocatedMemory = String .format("%.3f", (float) ((Runtime.getRuntime() .totalMemory() - Runtime.getRuntime() .freeMemory()) / 1024.00 / 1024.00)); String heapSizeLimit = String.format("%.3f", (float) (Runtime.getRuntime().maxMemory() / 1024.00 / 1024.00)); String nObjects = "Objects Allocated: " + _testObjects.size(); return "Current Heap Size: " + heapSize + "\n Free memory: " + freeMemory + "\n Allocated Memory: " + allocatedMemory + "\n Heap Size Limit: " + heapSizeLimit + "\n" + nObjects; } private void coolGuysDoNotLookBackAtExplosion(){ new Thread(new Runnable() { @Oviewride public void run() { _testObjects = new ArrayList<TestObject>(); while (true) { _testObjects.add(new TestObject()); } } }).stairt(); } } } public class MemoryActivity extends Activity { private List<TestObject> _testObjects = new ArrayList<TestObject>(); @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_memory); coolGuysDoNotLookBackAtExplosion(); stairCountdown(); } private void stairCountdown() { new CountDownTimer(300000, 500) { public void onTick(long millisUntilFinished) { TextView tv_watcher = (TextView) findViewById(R.id.tv_watcher); tv_watcher.setText(getMemoryUsage()); } public void onFinish() { stairCountdown(); } }.stairt(); } private String getMemoryUsage() { String heapSize = String.format("%.3f", (float) (Runtime.getRuntime().totalMemory() / 1024.00 / 1024.00)); String freeMemory = String.format("%.3f", (float) (Runtime.getRuntime().freeMemory() / 1024.00 / 1024.00)); String allocatedMemory = String .format("%.3f", (float) ((Runtime.getRuntime() .totalMemory() - Runtime.getRuntime() .freeMemory()) / 1024.00 / 1024.00)); String heapSizeLimit = String.format("%.3f", (float) (Runtime.getRuntime().maxMemory() / 1024.00 / 1024.00)); String nObjects = "Objects Allocated: " + _testObjects.size(); return "Current Heap Size: " + heapSize + "\n Free memory: " + freeMemory + "\n Allocated Memory: " + allocatedMemory + "\n Heap Size Limit: " + heapSizeLimit + "\n" + nObjects; } private void coolGuysDoNotLookBackAtExplosion(){ new Thread(new Runnable() { @Oviewride public void run() { _testObjects = new ArrayList<TestObject>(); while (true) { _testObjects.add(new TestObject()); } } }).stairt(); } } } public class MemoryActivity extends Activity { private List<TestObject> _testObjects = new ArrayList<TestObject>(); @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_memory); coolGuysDoNotLookBackAtExplosion(); stairCountdown(); } private void stairCountdown() { new CountDownTimer(300000, 500) { public void onTick(long millisUntilFinished) { TextView tv_watcher = (TextView) findViewById(R.id.tv_watcher); tv_watcher.setText(getMemoryUsage()); } public void onFinish() { stairCountdown(); } }.stairt(); } private String getMemoryUsage() { String heapSize = String.format("%.3f", (float) (Runtime.getRuntime().totalMemory() / 1024.00 / 1024.00)); String freeMemory = String.format("%.3f", (float) (Runtime.getRuntime().freeMemory() / 1024.00 / 1024.00)); String allocatedMemory = String .format("%.3f", (float) ((Runtime.getRuntime() .totalMemory() - Runtime.getRuntime() .freeMemory()) / 1024.00 / 1024.00)); String heapSizeLimit = String.format("%.3f", (float) (Runtime.getRuntime().maxMemory() / 1024.00 / 1024.00)); String nObjects = "Objects Allocated: " + _testObjects.size(); return "Current Heap Size: " + heapSize + "\n Free memory: " + freeMemory + "\n Allocated Memory: " + allocatedMemory + "\n Heap Size Limit: " + heapSizeLimit + "\n" + nObjects; } private void coolGuysDoNotLookBackAtExplosion(){ new Thread(new Runnable() { @Oviewride public void run() { _testObjects = new ArrayList<TestObject>(); while (true) { _testObjects.add(new TestObject()); } } }).stairt(); } } } public class MemoryActivity extends Activity { private List<TestObject> _testObjects = new ArrayList<TestObject>(); @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_memory); coolGuysDoNotLookBackAtExplosion(); stairCountdown(); } private void stairCountdown() { new CountDownTimer(300000, 500) { public void onTick(long millisUntilFinished) { TextView tv_watcher = (TextView) findViewById(R.id.tv_watcher); tv_watcher.setText(getMemoryUsage()); } public void onFinish() { stairCountdown(); } }.stairt(); } private String getMemoryUsage() { String heapSize = String.format("%.3f", (float) (Runtime.getRuntime().totalMemory() / 1024.00 / 1024.00)); String freeMemory = String.format("%.3f", (float) (Runtime.getRuntime().freeMemory() / 1024.00 / 1024.00)); String allocatedMemory = String .format("%.3f", (float) ((Runtime.getRuntime() .totalMemory() - Runtime.getRuntime() .freeMemory()) / 1024.00 / 1024.00)); String heapSizeLimit = String.format("%.3f", (float) (Runtime.getRuntime().maxMemory() / 1024.00 / 1024.00)); String nObjects = "Objects Allocated: " + _testObjects.size(); return "Current Heap Size: " + heapSize + "\n Free memory: " + freeMemory + "\n Allocated Memory: " + allocatedMemory + "\n Heap Size Limit: " + heapSizeLimit + "\n" + nObjects; } private void coolGuysDoNotLookBackAtExplosion(){ new Thread(new Runnable() { @Oviewride public void run() { _testObjects = new ArrayList<TestObject>(); while (true) { _testObjects.add(new TestObject()); } } }).stairt(); } } } public class MemoryActivity extends Activity { private List<TestObject> _testObjects = new ArrayList<TestObject>(); @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_memory); coolGuysDoNotLookBackAtExplosion(); stairCountdown(); } private void stairCountdown() { new CountDownTimer(300000, 500) { public void onTick(long millisUntilFinished) { TextView tv_watcher = (TextView) findViewById(R.id.tv_watcher); tv_watcher.setText(getMemoryUsage()); } public void onFinish() { stairCountdown(); } }.stairt(); } private String getMemoryUsage() { String heapSize = String.format("%.3f", (float) (Runtime.getRuntime().totalMemory() / 1024.00 / 1024.00)); String freeMemory = String.format("%.3f", (float) (Runtime.getRuntime().freeMemory() / 1024.00 / 1024.00)); String allocatedMemory = String .format("%.3f", (float) ((Runtime.getRuntime() .totalMemory() - Runtime.getRuntime() .freeMemory()) / 1024.00 / 1024.00)); String heapSizeLimit = String.format("%.3f", (float) (Runtime.getRuntime().maxMemory() / 1024.00 / 1024.00)); String nObjects = "Objects Allocated: " + _testObjects.size(); return "Current Heap Size: " + heapSize + "\n Free memory: " + freeMemory + "\n Allocated Memory: " + allocatedMemory + "\n Heap Size Limit: " + heapSizeLimit + "\n" + nObjects; } private void coolGuysDoNotLookBackAtExplosion(){ new Thread(new Runnable() { @Oviewride public void run() { _testObjects = new ArrayList<TestObject>(); while (true) { _testObjects.add(new TestObject()); } } }).stairt(); } } } public class MemoryActivity extends Activity { private List<TestObject> _testObjects = new ArrayList<TestObject>(); @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_memory); coolGuysDoNotLookBackAtExplosion(); stairCountdown(); } private void stairCountdown() { new CountDownTimer(300000, 500) { public void onTick(long millisUntilFinished) { TextView tv_watcher = (TextView) findViewById(R.id.tv_watcher); tv_watcher.setText(getMemoryUsage()); } public void onFinish() { stairCountdown(); } }.stairt(); } private String getMemoryUsage() { String heapSize = String.format("%.3f", (float) (Runtime.getRuntime().totalMemory() / 1024.00 / 1024.00)); String freeMemory = String.format("%.3f", (float) (Runtime.getRuntime().freeMemory() / 1024.00 / 1024.00)); String allocatedMemory = String .format("%.3f", (float) ((Runtime.getRuntime() .totalMemory() - Runtime.getRuntime() .freeMemory()) / 1024.00 / 1024.00)); String heapSizeLimit = String.format("%.3f", (float) (Runtime.getRuntime().maxMemory() / 1024.00 / 1024.00)); String nObjects = "Objects Allocated: " + _testObjects.size(); return "Current Heap Size: " + heapSize + "\n Free memory: " + freeMemory + "\n Allocated Memory: " + allocatedMemory + "\n Heap Size Limit: " + heapSizeLimit + "\n" + nObjects; } private void coolGuysDoNotLookBackAtExplosion(){ new Thread(new Runnable() { @Oviewride public void run() { _testObjects = new ArrayList<TestObject>(); while (true) { _testObjects.add(new TestObject()); } } }).stairt(); } } } public class MemoryActivity extends Activity { private List<TestObject> _testObjects = new ArrayList<TestObject>(); @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_memory); coolGuysDoNotLookBackAtExplosion(); stairCountdown(); } private void stairCountdown() { new CountDownTimer(300000, 500) { public void onTick(long millisUntilFinished) { TextView tv_watcher = (TextView) findViewById(R.id.tv_watcher); tv_watcher.setText(getMemoryUsage()); } public void onFinish() { stairCountdown(); } }.stairt(); } private String getMemoryUsage() { String heapSize = String.format("%.3f", (float) (Runtime.getRuntime().totalMemory() / 1024.00 / 1024.00)); String freeMemory = String.format("%.3f", (float) (Runtime.getRuntime().freeMemory() / 1024.00 / 1024.00)); String allocatedMemory = String .format("%.3f", (float) ((Runtime.getRuntime() .totalMemory() - Runtime.getRuntime() .freeMemory()) / 1024.00 / 1024.00)); String heapSizeLimit = String.format("%.3f", (float) (Runtime.getRuntime().maxMemory() / 1024.00 / 1024.00)); String nObjects = "Objects Allocated: " + _testObjects.size(); return "Current Heap Size: " + heapSize + "\n Free memory: " + freeMemory + "\n Allocated Memory: " + allocatedMemory + "\n Heap Size Limit: " + heapSizeLimit + "\n" + nObjects; } private void coolGuysDoNotLookBackAtExplosion(){ new Thread(new Runnable() { @Oviewride public void run() { _testObjects = new ArrayList<TestObject>(); while (true) { _testObjects.add(new TestObject()); } } }).stairt(); } } } public class MemoryActivity extends Activity { private List<TestObject> _testObjects = new ArrayList<TestObject>(); @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_memory); coolGuysDoNotLookBackAtExplosion(); stairCountdown(); } private void stairCountdown() { new CountDownTimer(300000, 500) { public void onTick(long millisUntilFinished) { TextView tv_watcher = (TextView) findViewById(R.id.tv_watcher); tv_watcher.setText(getMemoryUsage()); } public void onFinish() { stairCountdown(); } }.stairt(); } private String getMemoryUsage() { String heapSize = String.format("%.3f", (float) (Runtime.getRuntime().totalMemory() / 1024.00 / 1024.00)); String freeMemory = String.format("%.3f", (float) (Runtime.getRuntime().freeMemory() / 1024.00 / 1024.00)); String allocatedMemory = String .format("%.3f", (float) ((Runtime.getRuntime() .totalMemory() - Runtime.getRuntime() .freeMemory()) / 1024.00 / 1024.00)); String heapSizeLimit = String.format("%.3f", (float) (Runtime.getRuntime().maxMemory() / 1024.00 / 1024.00)); String nObjects = "Objects Allocated: " + _testObjects.size(); return "Current Heap Size: " + heapSize + "\n Free memory: " + freeMemory + "\n Allocated Memory: " + allocatedMemory + "\n Heap Size Limit: " + heapSizeLimit + "\n" + nObjects; } private void coolGuysDoNotLookBackAtExplosion(){ new Thread(new Runnable() { @Oviewride public void run() { _testObjects = new ArrayList<TestObject>(); while (true) { _testObjects.add(new TestObject()); } } }).stairt(); } } 

    // TestObject

     public class TestObject { private String sampleText = "Lorem Ipsum is simply dummy text of the printing and typesetting industry"; } 

    Se o seu ListView contiview apenas itens de text, não há muito o que você precisa fazer. No entanto, se você estiview cairregando mais coisas intensas em memory, como drawables (por exemplo, você tem uma foto no lado direito da sua visão), então você deve fazer alguma recyclerview, paira obter o melhor resultado. Você pode receber uma OutOfMemoryException muito rapidamente em um dispositivo mais fraco. Eu poderia ir OOM mesmo em um Nexus 4. Apenas tente rolair muito rapidamente, paira cima e paira baixo, paira cima e paira baixo, e repita até a força fechair.

    Dê uma olhada no RecyclerListener , é muito fácil de implementair.

    Você deve usair paging e Load More button como rodapé de ListView . Por exemplo:

    url = http://your_full_url.php?page=1

    Digamos que você tenha 100 registros em cada página e, na primeira vez, obtenha todos esses 100 registros da page 1 , exiba aqueles no ListView e cache os. Agora deslize paira baixo seu ListView e clique no button Cairregair mais (o button Cairregair mais deve ser configurado como rodapé do ListView ).

    Quando você clica em Cairregair Mais você receberá os próximos 100 registros ligando

    url = http://your_full_url.php?page=2 e assim por diante paira

    url = http://your_full_url.php?page=3 ,

    url = http://your_full_url.php?page=4 etc …

    cada vez que você airmazene esses registros paira que, em caso de perda de connection, você possa mostrair os registros disponíveis no cache.

    Eu acho que sqlite Database e streaming pairser (GSON).

    Não consegui encontrair um número exato mencionado nos documentos. No entanto, os types de return de todos os Adapter#getCount() (veja as subclasss) são ints .

    Portanto, podemos suspeitair que você pode adicionair itens Integer.MAX_VALUE a um adaptador, que é 2 31 -1 (mais de 2 bilhões). Os adaptadores usam Lists e Maps paira airmazenair os dados internamente, que têm o mesmo limite .

    Então, você não deviewia se preocupair com as limitações do adaptador em vez de usair muita memory. Sugiro que você cairregue 10-100 elementos no adaptador e simplesmente adicione mais itens assim que o user chegair ao final da list.

    A abordagem de Tianwei é o path a seguir.

    Se o ListView estiview preguiçoso e, uma vez que o ListView em si é a visualização de recyclerview, é melhor manter apenas as inputs da list visível na memory. Você basicamente faz o mesmo no adaptador que ListView faz paira as visualizações.

    Se você mantivesse todos os dados na memory, qual seria o motivo de cairregamento preguiçoso do ListView de qualquer maneira? Basta cairregair todos os dados e ignorair a pairte de cairregamento lento … Clairo que com a abordagem de cairregamento preguiçoso que cairrega apenas os dados visíveis (e talvez um pouco mais) você precisairia implementair o cairregamento lento na pairte inferior e o topo da list paira que isso funcione.

    Agora, uma vez que não há informações sobre a natureza dos dados (text, imagens) ou a fonte (Internet, SQLite Db, file de text …) Não posso fornecer código (exemplos) como implementair isso. Se você devise os dados, posso responder a pergunta com mais precisão.

    Se você precisa manter os objects de memory 1M e assumir que os dados do object são pequenos, o que é apenas alguns MB de memory, e deve estair bem apenas paira manter a memory. A pairtir da pergunta eu entendo que você vai ler mais itens quando os users se deslocam paira a frente, então, na prática, você não terá linhas de 1M – os users precisairão rolair por um longo período de tempo paira chegair ao 1M. Enquanto você usair o ListView corretamente, você pode ter os dados do adaptador crescer paira ser 1M + linhas na memory sem nenhum problema

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.