как избежать утечек памяти в андроиде - PullRequest
0 голосов
/ 21 июля 2011

Я динамически обновляю раскладку таблицы, как показано ниже, где я добавляю кнопку image и Textview для каждого tableRow. Каждый раз, когда я запускаю свою деятельность, она показывает только 4 строки (на самом деле должна отображать 10), но если я сохраню точки останова в коде иОтладка медленно, чтобы выяснить проблему, он отображает все 10 строк правильно.Я сомневаюсь, что это должно быть проблема с памятью в коде, так как я получаю изображения из Интернета, которые, как мне кажется, занимают много памяти.Я пытался освободить память просмотров после добавления в макет, но он постоянно падает.
Пожалуйста, дайте мне знать, где я делаю неправильно.

for (int i = 0; i < parsedExampleDataSet.getAppNameString().size(); i++)  
{  
 TableRow row = new TableRow(this);  
 TextView tv = new TextView(this);  
 tv.setText("AppName: "+ parsedExampleDataSet.getAppNameString().get(i) +"\n"     + "Description: " + parsedExampleDataSet.getDescriptionString().get(i));  
 ImageButton imgBtn = new ImageButton(this);  
 URL aURL = new URL(parsedExampleDataSet.getImageUrlString().get(i));   
 URLConnection conn = aURL.openConnection();   
 conn.connect();   
 InputStream is = conn.getInputStream();   
 BufferedInputStream bis = new BufferedInputStream(is);  
 Bitmap bm = BitmapFactory.decodeStream(bis);   
 imgBtn.setImageBitmap(bm);  
 imgBtn.setBackgroundColor(color.transparent);  
 imgBtn.setTag(parsedExampleDataSet.getMarketLinkString().get(i));  
 bis.close();   
 is.close();                      
 row.addView(imgBtn);  
 row.addView(tv);  
 table.addView(row,new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));  //here table is a tablelayout object

}

Заранее спасибо
Пратима

Ответы [ 2 ]

0 голосов
/ 21 июля 2011

Ответ, кажется, находится в parsedExampleDataSet.getAppNameString().size():

  • Когда вы запускаете программу, цикл for(;;) повторяется только 4 раза

  • Когда вы запускаете отладчик и шагаете вручную, он повторяется 10 раз, что соответствует вашему ожиданию

Как заполняется parsedExampleDataSet.getAppNameString ()? Его размер используется в качестве верхней границы цикла for(;;), и, похоже, со временем он меняется. Если он будет заполнен асинхронным процессом (потоком), это объяснит проблему.

Не стесняйтесь добавлять больше деталей и дайте мне знать. Я отредактирую / уточню этот ответ в дальнейшем для новых элементов, которые вы принесете.

0 голосов
/ 21 июля 2011

Если вы хотите загрузить более одной строки, чем использовать ListView.

Он обрабатывает все проблемы с памятью и лучше, чем TableLayout.

здесь является хорошим примером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...