Android卡住了LoaderManager

时间:2012-09-17 10:37:09

标签: android android-loadermanager

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

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

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

  • 有没有办法通过LoaderManager实现这一目标?我尝试使用startLoading()stopLoading,但没有成功,无论如何不推荐。

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

感谢您的建议。

修改

我实际上错过了一种方法...... setUpdateThrottle(long delayMS)正是我想要的。

1 个答案:

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

您可以使用它将插入批处理到一个事务中,因此通知只发生一次。