0

データベースとコンテンツ プロバイダーを備えたアプリケーションがあります。データベースのデータを で表示するためにListView、 を使用しますLoaderManager。シンプルで、ほとんどの場合、完璧に機能します。

しかし、コンテンツ プロバイダーから多くの変更通知が届くと、UI は完全に過負荷になります。これは、カーソルが監視する uri に多くの挿入 (1 秒あたり約 15 回) がある場合に発生します。カーソルの読み込みがバックグラウンドであっても、大量のbindView()呼び出しで UI が過負荷になると思います。

したがって、場合によっては、上記のように、ロード (およびonLoadFinished()呼び出し) の数を 1 秒あたり 1 回などに制限したいと思います。

  • でそれを達成する方法はありLoaderManagerますか?startLoading()andで遊んでみました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();
    }
}

これを使用して、挿入を 1 つのトランザクションにまとめて、通知が 1 回だけ発生するようにすることができます。

于 2012-09-17T10:52:26.180 に答える