Android ListView с утечкой памяти SimpleAdapter

Это продолжение моего предыдущего вопроса ( Утечка памяти Android? ) после проведения некоторых исследований и выполнения некоторых из предложенные шаги.

В моем приложении есть цикл пользовательского интерфейса, в котором пользователь щелкает элемент ListView, который рисует другой ListView после запроса веб-API. Щелчок по элементу создаст другой ListView. Этот процесс может быть повторен пользователем много раз без завершения действия.

Вот фрагмент кода того, как я заполняю ListView с помощью SimpleAdapter.

//* Add available times value using array.length()
        List<Map<String,Object>> datalist = new ArrayList<Map<String,Object>>();
        for (SomeResult result : results) {
            Map map = new HashMap();
            map.put("field_a", result.field_a);
            map.put("field_b", result.field_b);
            datalist.add(map);
        }

        String[] from = {"field_a","field_b"};

        int[] to = {R.id.textview_a,R.id.textview_b};

        // get a reference to the ListView

        ListView lv = (ListView)findViewById(R.id.listview);

        lv.setBackgroundColor(0xffffffff);

        lv.setOnItemClickListener(itemclick_drawHours);

        SimpleAdapter adapter = new SimpleAdapter(this.getApplicationContext(), datalist, R.layout.list_item, from, to);
        lv.setAdapter(adapter);

        lv.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
        lv.setCacheColorHint(0xffffffff);
        viewFlipper.setDisplayedChild(2);

Используя DDMS и MAT, я заметил, что хотя количество объектов ListView не увеличивается, количество объектов TextView, RelativeLayouts и ImageView неуклонно растет вместе с количеством кликов пользователя и отрисовкой нового списка. Вот количество объектов этих трех виджетов + ListView на разных этапах использования приложения.

App Installed onto emulator:
  android.widget.TextView: 16
  android.widget.RelativeLayout: 9
  android.widget.ImageView: 8
  android.widget.ListView: 4

Light Use (a dozen or so clicks and ListViews drawn):
  android.widget.TextView: 107
  android.widget.RelativeLayout: 48
  android.widget.ImageView: 34
  android.widget.ListView: 4

Medium Use (a couple dozen clicks/ListViews drawn):
  // At this point, a lot of GC messages and Resizing JIT Table messages etc. in LogCat
  android.widget.TextView: 158
  android.widget.RelativeLayout: 72
  android.widget.ImageView: 61
  android.widget.ListView: 4

Heavy Use (three dozen or so clicks/ListViews drawn):
  // Even more messages in logcat
  android.widget.TextView: 222
  android.widget.RelativeLayout: 103
  android.widget.ImageView: 92
  android.widget.ListView: 4

Приложение на самом деле не вылетает при открытии, просто становится менее отзывчивым и тормозит. После периода среднего/интенсивного использования закрытие и открытие приложения вызывает ошибку OutOfMemory при отображении ImageView.

Вот list_item.xml..

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
<TextView 
    android:id="@+id/textview_a"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:padding="10dp"
    android:textColor="#000000"
    android:layout_alignParentLeft="true"
    android:textSize="18dp" >
</TextView>
<ImageView 
    android:id="@+id/rightarrow" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:layout_marginRight="5dip"
    android:src="@drawable/garrow"
    android:layout_alignParentRight="true"
/>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:text="" android:id="@+id/textview_b" android:visibility="gone" />
</RelativeLayout>

Если вы посмотрите на соотношение 2 (TextViews) к 1 (ImageView) к 1 (RelativeLayout) в этом шаблоне и в количестве объектов выше, кажется, что ImageViews, TextViews и RelativeLayouts, созданные SimpleAdapter, не выпускаются должным образом.

Есть ли что-то очевидное, что я упускаю? Я читал некоторые другие сообщения, в которых говорится, что эта проблема возникает только в режиме «отладки». Я не уверен, как включить/выключить это, кроме изменения android:debuggable="true" или "false" в манифесте.


person Arjun    schedule 19.11.2011    source источник


Ответы (1)


List<Map<String,Object>> ?...List of Maps each of which keys on a string to an object ... 

Что такое результат? может быть, звучит так, как будто это ключи вовремя, как время события, - тогда вы добавляете в коллекцию, введенную в строковый литерал, - нужно прочитать еще несколько документов.

list_item.xml инициализирует программу = это не контекст кодирования для программы

Я новичок в Android, но я достаточно хорошо пишу на Java, чтобы увидеть, что вам нужно заполнить ListView из коллекции, что без подробностей может быть

TreeMap<Integer,SomeResult>Stuff=new TreeMap<Integer,SomeResult>();

чтобы получить новый элемент, где программа может его найти, вы помещаете его в коллекцию по вашему выбору - у них есть разреженный тип данных коллекции где-то в работе

Я не вижу, откуда идет утечка, но держу пари, что это из R., поскольку чтение того, как это работает, делает меня вероятным кандидатом на основе того, как вы его используете, по сравнению с тем, как это работает.

person Nicholas Jordan    schedule 19.11.2011