我有一个数据库和内容提供商的应用程序。为了在ListView
中显示数据库中的一些数据,我使用LoaderManager
。
它很简单,在大多数情况下都能很好地工作。
但是,当内容提供商的许多更改通知到达时,UI完全超载。当光标观察到的uri上有许多插入,大约每秒15次时,就会发生这种情况。我认为即使光标加载在后台,大量的bindView()
调用也足以重载UI。
所以我想,在某些情况下,如上所述,将加载次数(以及onLoadFinished()
次调用)限制为每秒一次。
有没有办法通过LoaderManager
实现这一目标?我尝试使用startLoading()
和stopLoading
,但没有成功,无论如何不推荐。
或许我必须自己管理Loader
,但如果这种情况不常见,我会感到惊讶。
感谢您的建议。
修改
我实际上错过了一种方法...... setUpdateThrottle(long delayMS)
正是我想要的。
答案 0 :(得分:2)
您可以在内容提供商中覆盖applyBatch(...)并执行以下操作:
@Override
public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations)
throws OperationApplicationException {
final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
db.beginTransaction();
try {
final int numOperations = operations.size();
final ContentProviderResult[] results = new ContentProviderResult[numOperations];
for (int i = 0; i < numOperations; i++) {
results[i] = operations.get(i).apply(this, results, i);
}
db.setTransactionSuccessful();
return results;
} finally {
db.endTransaction();
}
}
您可以使用它将插入批处理到一个事务中,因此通知只发生一次。