释放未使用在创建新的时候查看

我的应用程序中有两种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上找到。

回答:

从下面的代码中可以看出,您正在通过创建新的适配器来刷新数据,而不是告诉适配器数据已更改。尝试将数据传递给适配器,然后调用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);

}

以上是 释放未使用在创建新的时候查看 的全部内容, 来源链接: utcz.com/qa/266626.html

回到顶部