2014-02-17 4 views
0

В моем приложении у меня есть два типа ArrayAdapter, которые загружают динамические данные (более или менее). Первый связан с потоком, который срабатывает каждую секунду, чтобы обновить данные. Второй обновляет данные с помощью действия onClick.Бесплатно не используется Просмотр при создании новых

Теперь, когда я запускаю свое приложение, я могу видеть с помощью dumpsys meminfo, что счетчик просмотров постоянно увеличивается (пока на фрагменте с потоком). Очевидно, что это вызывает огромную утечку памяти через несколько секунд/минут. Тот же происходит для onClick one.

Мое предположение заключается в том, что эти «старые» данные все еще хранятся внутри этого вида и не будут освобождаться. Есть ли способ удалить каждый старый вид? Мой адаптер находится здесь; https://github.com/Blechd0se/android_packages_apps_AeroControl/blob/master/AeroControl/src/com/aero/control/adapter/AeroAdapter.java

Основной метод, который использует адаптер здесь (createList()); https://github.com/Blechd0se/android_packages_apps_AeroControl/blob/master/AeroControl/src/com/aero/control/fragments/AeroFragment.java

Или есть еще один способ просто освободить эти ненужные виды?

EDIT: Я нашел решение, если кто-либо заинтересован; Как описано, мне нужно использовать метод notifyDataSetChanged(), когда я меняю данные. Это возможно только при работе со списком. В моем примере его List<adapterInit>, который использует меня для использования указанного метода, а также clear(). Также setAdapter на каждую секунду - очень плохая идея. Теперь я изменяю только данные, и результат как и ожидалось. Количество просмотров уменьшилось с ~ 15.000 до 100-200. Патч можно найти на моем github.

ответ

0

Появляется (из кода ниже), что вы обновляете данные, создавая новый адаптер, а не сообщая адаптеру, что данные были изменены. Попробуйте передать данные адаптеру и затем вызвать notifyDataSetChanged();

Это не позволит вам спамить десятки новых просмотров каждую секунду.

Во-вторых, вы можете посмотреть, очистит ли сборщик мусора в какой-то момент. Поскольку вы создавали несколько просмотров в секунду, вы, вероятно, создавали представления быстрее, чем gc мог разумно поддерживать. Возможно, вы приостановили свою программу, если достигли критической точки (не уверен). Убедитесь, что вы на самом деле сбой из-за нехватки памяти, чтобы определить, действительно ли это утечка памяти.

private RefreshThread mRefreshThread = new RefreshThread(); 

    private Handler mRefreshHandler = new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 

      if (msg.what >= 1) { 


       if (isVisible() && mVisible) { 
        createList(); 
        mVisible = true; 
       } else { 
        // Do nothing 
       } 

      } 
     } 
    }; 

public void createList() { 

    // Default Overview Menu 
    adapterInit overview_data[] = new adapterInit[] 
      { 
        // First Value (0) is for loadable images. 
        new adapterInit(getString(R.string.kernel_version), AeroActivity.shell.getKernel()), 
        new adapterInit(getString(R.string.current_governor), AeroActivity.shell.getInfo(GOV_FILE)), 
        new adapterInit(getString(R.string.current_io_governor), AeroActivity.shell.getInfo(GOV_IO_FILE)), 
        new adapterInit(getString(R.string.current_cpu_speed), getFreqPerCore()), 
        new adapterInit(getString(R.string.current_gpu_speed), AeroActivity.shell.toMHz((AeroActivity.shell.getInfo(gpu_file).substring(0, AeroActivity.shell.getInfo(gpu_file).length() - 3)))), 
        new adapterInit(getString(R.string.available_memory), AeroActivity.shell.getMemory(FILENAME_PROC_MEMINFO)) 
      }; 

    listView1 = (ListView) root.findViewById(R.id.listView1); 

    adapter = new AeroAdapter(getActivity(), 
      R.layout.overviewlist_item, overview_data); 

    listView1.setAdapter(adapter); 

} 
+0

Даже если я добавляю что-то вроде; if (adapter! = null) новый адаптер else adapter.notifyDataSetChanged() он все равно не будет работать. Взгляды продолжают расти, и я не знаю, почему. Я попытался изменить структуру данных на список, поэтому я могу вызвать clear-Method, но все равно создаст бесконечные представления. – Blechd0se

+0

Я вижу ваше последнее редактирование, проблема решена? У меня есть некоторые догадки, которые я могу добавить, если у вас все еще есть проблемы. – NameSpace

+0

Да проблема в основном решена. Большое спасибо! Единственный недостаток; он создает теперь новое представление (listview) для каждого из onPause() -> onResume(), которое выглядит нормально. Если у вас есть решение, я был бы очень доволен. – Blechd0se

Смежные вопросы