释放未使用在创建新的时候查看
我的应用程序中有两种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