2012-03-06 34 views
4

ちょうど好奇心。ContentProviderスレッディング

getContentResolver().query(...) 

ローダーはバックグラウンドスレッドでクエリを実行することがわかりました。これは、挿入、更新、および削除にも適用されますか?私はAsyncTasks、スレッドなどを作成する必要があります...これらの種類の呼び出しですか? 更新が大きいと、アプリケーションのメインスレッドがブロックされる可能性があります。

getContentResolver().insert(...) 

ありがとうございます!

答えて

5

プロバイダ

からデータを取得

Content Provider Basicsからこのセクションでは、例として ユーザー辞書プロバイダを使用して、プロバイダからデータを取得する方法について説明します。明確にするために

、実際のコードでは、「UIスレッド」」で、このセクションのコール ContentResolver.query()インチ コードスニペットは、しかし、 あなたは別のスレッドで非同期的にクエリを行う必要があります。これを行う する一つの方法は、ローダーガイドにより 詳細に記載されているCursorLoaderクラスを使用することです。また、コードの行は抜粋のみ であり、彼らは完全なアプリケーションを示していない

1

ローダーはクエリに対してのみ機能します。つまり、アクティビティまたはフラグメント内のデータを読み込み、その他のt hanの挿入/更新/削除

Android 3.0以降ではローダーの他に、アンドロイドはAPIレベル1以降のヘルパークラスAsyncQueryHandlerを提供していました。完全なCRUDコールバックを使用した非同期CRUD操作のようにサポートされています。

AsyncQueryHandlerは、内部で非同期操作用のHandlerThreadを使用し、結果をメインスレッドに戻します。 AsyncTaskまたは単純なワーカースレッドを使用することも、特定の要件の点で一般的なプラクティスです。

1

ローダーがバックグラウンドスレッドでクエリを実行すると言うと、バックグラウンドスレッドでクエリを実行するのはLoaderクラスの実装であることを理解する必要があります。

この結果、抽象クラスのサブクラスを使用または拡張して実装し、AsyncTaskまたはJavaスレッドを使用しないことが必要です。理由は、Loaderを作成するときに、Loader型のインスタンスを返すことが予想されるためです。これに対してJavaスレッドまたはAsyncTaskを使用することはできません。 Loaderクラスのサブクラスは、独自のスレッドを開始することでこれを行います。クライアントクラスまたはローダを作成するクラスは、ローダのみを初期化します。実際のLoaderインスタンスは、必要な処理を実行できます。これは、挿入、更新、削除など何でもかまいません。Android提供のCursorLoader実装は、バックグラウンドスレッドのテーブルからデータを非同期で照会し、結果セットを返します。 Androidは、データの挿入や更新に似たネイティブ実装を提供していません。あなたが持っているのは、AsyncTaskLoader(CursorLoaderが継承するのと同じクラス)から拡張するオプションです。

また、ローダーはデータベースへのアクセスを最適化するために使用されるため、その前にタスクを完了したときにのみメインスレッドに結果を通知します(更新をポストする回避策UIスレッドに渡しますが、これはパラダイムを破ります)。ローダーは作業を完了することにのみ関心があり、更新を提供することには興味がありません。

ContentProviderクエリを非同期で処理したい場合は、Androidで提供されているAsyncQueryHandlerクラスの使用を検討してください。