2014-02-17 15 views
0

我的應用程序中有兩種ArrayAdapter,它們同時加載(或多或少)動態數據。 第一個綁定到一個線程,每秒觸發一次線程刷新數據。 第二個使用onClick操作刷新數據。釋放未使用在創建新的時候查看

現在,當我運行我的應用程序時,我可以看到與dumpsys meminfo,查看計數器 不斷增加(而與線程片段)。 顯然這會在幾秒/分鐘後導致巨大的內存泄漏。與onClick相同, 也會發生。

我的假設是,那些「舊」數據仍然存儲在這些視圖內,並不會 獲得釋放。有沒有辦法刪除每個舊視圖? 我的適配器位於此處; 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

或者還有另一種方法來釋放那些不需要的視圖嗎?

編輯: 我找到了一個解決方案,如果有人感興趣; 如上所述,我需要使用notifyDataSetChanged() - 方法,只要我更改數據。 這隻有在使用List的情況下才有可能。在我的例子中,它的List<adapterInit>其中 我使用上述方法以及clear()。另外setAdapter每秒 是一個非常糟糕的主意。現在我只更改數據,結果如預期。 View-Count 從〜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

即使我添加類似的東西;如果(適配器!=空)新的適配器其他adapter.notifyDataSetChanged()它仍然不會工作。意見不斷增加,我不知道爲什麼。我試圖將數據結構更改爲List,所以我可以調用clear-Method,但它仍然會創建無限的視圖。 – Blechd0se

+0

我看到你的最新編輯,問題解決了嗎?如果您仍然遇到問題,我可以添加一些猜測。 – NameSpace

+0

大部分問題都解決了。非常感謝你!唯一的缺點;它現在在每個onPause() - > onResume()上創建一個新的視圖(列表視圖),這是一種很好的方法。如果你也有解決方案,我會很高興。 – Blechd0se

相關問題