在Android SQLite中,直接使用Cursor比创建模型对象更节省内存?

时间:2014-11-15 08:10:46

标签: android android-listview android-sqlite android-cursor android-memory

在大多数 Android 示例代码中,从 SQLite 数据库填充 ListView 有两种方式,

  1. 将数据预取到列表执行查询,为每行创建模型对象,然后将其添加到列表关闭 光标,然后使用列表填充 ListView

  2. 没有列表和模型对象 - 执行查询并使用 moveToFirst 按照光标填充 ListView >, moveToLast 移动,视需要而定。

  3. 现在我想知道,在 Android 中,上述哪种方法的内存效率更高?

2 个答案:

答案 0 :(得分:5)

Cursor方法更节省内存:

假设您的数据库中有1000个条目,并且您有一个可以同时显示10个条目的ListView。如果您首先创建一个列表,则必须创建1000个模型对象(每个对象依次由多个对象组成,具体取决于表的列数),listview创建额外的10个视图(实际上还有一些用于显示10个项目,具体取决于列表的布局。现在,当用户滚动列表时,在适配器中最终将模型对象中的数据复制到当前视图中的列表项视图。

另一方面,如果你使用CursorAdapter,每当你必须用数据填充一个列表项时,你会得到Cursor准确保存该行的数据,你可以简单地选择数据您实际需要在列表项中显示的列。无需创建1000个模型对象。

从代码可读性的角度来看,模型方法会更好,因为使用游标的级别很低,您需要知道数据库中列的名称等等。

答案 1 :(得分:0)

我认为您需要使用Service或至少Thread/Async,因此您的UI线程将被阻止。 Service更好,因为人们可以在下载时访问其他应用。您可以使用BroadcastReceiver与正在投放的Service进行通信。