我正在开发以下功能:
用户选择日期并获取ListView
填充SimpleCoursorLoader
(查询在后台执行)。
用户经常选择相邻日期,可能会有很多重复的查询
我测试了应用程序并发现在高频请求的情况下 - 它运行得很慢
为了加速我的应用程序,我决定实现缓存,其中将存储查询结果。关键 - 日期和价值 - ?
值得做,你能提出什么技巧?
答案 0 :(得分:0)
我发现MatrixCursor对于缓存非常有用。我保留了HashMap 逻辑:如果没有请求 - 发出它,获取Cursor,将其转换为MatrixCursor并写入缓存。
以下是转换代码段:
private MatrixCursor cursorToMatrixCursor(Cursor c) {
MatrixCursor result = new MatrixCursor(c.getColumnNames());
if (c.moveToFirst()) {
do {
ArrayList<String> columnValues = new ArrayList<>();
final int nOfColumns = c.getColumnCount();
for(int col = 0; col < nOfColumns; ++col)
columnValues.add(c.getString(col));
result.addRow(columnValues);
} while (c.moveToNext());
}
return result;
}
答案 1 :(得分:0)
1)是的,由于数据库访问速度相对较慢(即使是像SQLite这样的好东西),这真的值得做。
2)考虑到我从你的帖子得到的内容我建议使用LongSparseArray:密钥将是数据库中的约会日期(long
),> 存储值 - 您的缓存数据对象(Bundle
等)。
原因是:
3)当您需要加载重叠/相邻间隔时,您必须检查边界并仅加载缺少部分
4)如果在缓存非相邻间隔时可能出现这种情况 - 您还需要管理加载的间隔范围。但是如果你只为列表滚动目的而这样做,你可以省略它(如果你不停止在fling手势上加载数据)
关于我的经验:我使用缓存获得了大约3倍的回报。但实际结果取决于数据库方案等。您可能会得到更多