Android ListView с утечкой памяти в SimpleAdapter - PullRequest
1 голос
/ 19 ноября 2011

Это продолжение моего более раннего вопроса ( утечка памяти 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 не увеличивается, число TextViews, RelativeLayouts и ImageViews неуклонно увеличивается вместе с количеством нажатий пользователем и составлением нового списка. Вот количество объектов этих трех виджетов + 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, не выпускаются должным образом.

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

1 Ответ

0 голосов
/ 19 ноября 2011
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. Поскольку чтение о том, как это работает, показывает, что вероятный кандидат на мой взгляд основан на том, как вы его используете, по сравнению с тем, как он работает

...