0

我有一个带有数据库和内容提供程序的应用程序。为了在ListView's 中显示数据库中的一些数据,我使用LoaderManager. 它很简单,在大多数情况下都能很好地工作。

但是,当来自内容提供者的许多更改通知到达时,UI 就会完全过载。当光标观察到的 uri 上有很多插入(大约每秒 15 次)时,就会发生这种情况。我认为即使光标加载在后台,大量bindView()调用也足以使 UI 过载。

所以我想,在某些情况下,如上所述,将加载(以及onLoadFinished()调用)的数量限制为每秒一次。

  • 有没有办法做到这一点LoaderManager?我试过玩但没有成功startLoading()stopLoading无论如何不推荐。

  • 或者也许我必须自己管理一个Loader,但如果这种情况不常见,我会感到惊讶。

谢谢你的建议。

编辑

我实际上错过了一种方法......setUpdateThrottle(long delayMS)完全按照我的意愿去做。

4

1 回答 1

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();
    }
}

您可以使用它来将您的插入批处理到一个事务中,这样通知只会发生一次。

于 2012-09-17T10:52:26.180 回答