- 非同期のデータロードを行うための雛形を提供します。
- Loaderは、アクティブの間は対象となるデータセットソースを監視し、変更があった場
 合にクライアントへ通知を行います。
Loaderは非同期のデータロードを実行するための抽象クラスで、独自に拡張することが可
能ですが、直接Loaderクラスを継承することは推奨されていません。
代わりに、Loaderを継承したAsyncTaskLoaderを継承することができます。
AsyncTaskLoaderを継承した一般的な具象クラスはCursorをデータセットに持つCursorLoaderです。
参考:
Loaderを継承した簡単なサンプル
http://developer.android.com/intl/ja/resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderCustom.html
注意:Loaderを使用するクライアントは、Loaderを使用する際にはメインスレッドからコールする
必要があります。
例えば、AsyncTaskLoaderはロード処理をバックグラウンドスレッドで行いますが、ローダ
の呼び出しや、結果の受信スレッドはメインスレッドである必要があります。
■Loaderの主なメソッド群
●startLoading()
- Loaderを開始します。
- LoaderManager経由でLoaderを管理している場合、関連するActivity/Fragmentが開始さ
 れる時(onStart)、このメソッドはLoaderManagerによって自動的に呼び出されます。
- 結果のロードが完了し、通知の準備ができればメインスレッドのコールバック
 (Loader.onLoadComplete)が呼び出されます。
 ただし、前回のロードが完了済みかつ有効である場合は即コールバックが呼び出されます。
 コールバック通知はstopLoadingを呼び出すことで一時停止することができます。
- Loaderはデータセットソースに対するObserver(ForceLoadContentObserver)を内包しており、
 データセットソースの変更検知もLoaderが行ってくれます。
 そのため、Loaderを使用する場合はデータの監視を自身で行う必要はありませんが、
 CursorAdapterとLoaderを併用する場合には注意が必要で、
 CursorAdapter(android.content.Context, android.database.Cursor, int)コンストラ
 クタのflagには0をセットし、FLAG_AUTO_REQUERYまたはFLAG_REGISTER_CONTENT_OBSERVER
 はOFFしない(コンテンツ監視しない)ようにする必要があります。
- startLoadingを呼び出すと、Loaderの内部状態が更新されます。
 具体的には 開始状態=true / リセット状態=false / abandon状態=false
 となります。(それぞれの状態はisStarted(), isReset(), isAbandoned()で取得可)
 startLoadingは状態更新後、サブクラスレスポンスのためにonStartLoading()をコールします。
- このメソッドを直接コールするとLoaderの管理に影響がでるため避けるべきです。
- このメソッドは常にメインスレッドから実行する必要があります。
●onStartLoading()
- サブクラスはLoader開始時の実装をここで行います。
- このメソッドはstartLoading()経由でコールされることが前提となります。
 クライアントが直接このメソッドをコールすることは推奨されません。
- このメソッドは常にメインスレッドから実行する必要があります。
●stopLoading()
- Loaderを停止し、startLoading()が呼ばれるまでデータの更新通知も停止します。
- LoaderManager経由でLoaderを管理している場合、関連するActivity/Fragmentが停止
 される時、このメソッドはLoaderManagerによって自動的に呼び出されます。
- 実装においては、この時点でデータセットを無効にするべきではありません。
 クライアントはLoaderが最後に通知したデータ結果を自由に使用できるようにするべき
 です。
- Loaderが停止している間は、データセットが更新されてもそれがクライアントに通知さ
 れることはありません。
 ただし、Loaderが再開された時に正しい値(takeContentChangedの戻り値)を保証するた
 めに、データセットの監視は続けられます。
- stopLoadingを呼び出すことで、Loaderの内部状態が更新されます。
 具体的には 開始状態=false となります。(それぞれの状態はisStarted()で取得可)
 stopLoadingは状態更新後、サブクラスレスポンスのためにonStopLoading()をコールします。
- このメソッドを直接コールするとLoaderの管理に影響がでるため避けるべきです。
- このメソッドは常にメインスレッドから実行する必要があります。
●onStopLoading()
- サブクラスはLoader停止要求時の実装をここで行います。
- このメソッドはstopLoading()経由でコールされることが前提となります。
 クライアントが直接このメソッドをコールすることは推奨されません。
- このメソッドは常にメインスレッドから実行する必要があります。
●abandon()
- LoaderManager経由でLoaderを再起動(restartLoader)した際にLoaderManagerから自動的
 にコールされるメソッドです。
- abandonはreset()の前にコールされます。
 Loaderはabandon状態になっても現在のデータを保持し続けますが、それが更新された
 としてもユーザに通知することはありません。
- abandonを呼び出すことで、Loaderの内部状態が更新されます。
 具体的には abandon状態=true となります。(それぞれの状態はisAbandon()で取得可)
 abandonは状態更新後、サブクラスレスポンスのためにonAbandon()をコールします。
- このメソッドを直接コールするとLoaderの管理に影響がでるため避けるべきです。
●onAbandon()
- サブクラスはLoaderが不要となった時の実装をここで行います。
- Abandon状態はLoaderが不要となった状態を指します。
 リセットされる時はonResetが呼ばれる為、onAbandonがコールされたときのLoaderは
 start→resetの中間的な状態であると言えます。
- Abandon状態であるLoaderにクライアントは興味を持つことがありません。
 (おそらくクライアントは既に新しいLoaderを扱っています)
 そのため、AbandonなLoaderはユーザに通知を送ってはいけません。
 しかし、Loader.onReset()が処理されるまでLoaderはユーザに通知したデータを有効な
 状態に保ち続ける必要があります。
- このメソッドはabandon()経由でコールされることが前提となります。
 クライアントが直接このメソッドをコールすることは推奨されません。
- LoaderがAbandon状態かどうかはisAbandonedで取得可能です。
●reset()
- このメソッドはLoaderを破棄する場合にLoaderManagerから自動的に呼ばれるメソッド
 です。resetによりLoaderは破棄されます。
- このメソッドが再度コールされることはありません。
 Loaderはこの時点で解放できる全てのリソースを解放する必要があります。
 しかし、resetの後でstartLoadingが呼ばれることもあり、その際には再び実行可能で
 ある必要があります。
- resetを呼び出すことで、Loaderの内部状態が更新されます。
 具体的には 開始状態=false / リセット状態=true / abandon状態=false /
 データソース変更状態=false となります。
 (それぞれの状態はisStarted(), isReset(), isAbandoned(), takeContentChanged()で
 取得可)
- resetはLoaderの状態更新前に、サブクラスレスポンスの為にonReset()をコールします。
- このメソッドを直接コールするとLoaderの管理に影響がでるため避けるべきです。
- このメソッドは常にメインスレッドから実行する必要があります。
●onReset()
- サブクラスはLoaderのリセット要求時の実装をここで行います。
- このメソッドはreset()経由でコールされることが前提となります。
 クライアントが直接このメソッドをコールすることは推奨されません。
- このメソッドは常にメインスレッドから実行する必要があります。
●forceLoad()
- Loaderによるロードを強制します。
- startLoading()とは異なり、以前にロードしたデータは全てキャンセルされて、
 新しいものに置き換えられます。
- forceLoadは、サブクラスレスポンスのためにonForceLoad()をコールします。
- 通常、Loaderが開始状態(isStarted)の場合にこれを呼び出すべきです。
- このメソッドは常にメインスレッドから実行する必要があります。
●onForceLoad()
- サブクラスは強制ロード要求時の実装をここで行います。
- このメソッドは常にメインスレッドから実行する必要があります。
●onContentChanged()
- ForceLoadContentObserverがデータセットソースの変更を検知したときにコールされる
 メソッドです(ContentObserver.onChangeに相当)
- デフォルトでは、Loaderが開始済みの場合にforceLoadをコールし、開始していない場合
 はtakeContentChangedがtrueを返すようにフラグを設定します。
- このメソッドは常にメインスレッドから実行する必要があります。
●takeContentChanged()
- Loaderの停止中にデータセットに変更があったかどうかを取得できます。
 変更があった場合はtrueが返され、フラグ(変更状態)はリセットされます。
●deliverResult()
- クライアントへロード結果を送信します。
- このメソッドはサブクラスからコールされることを想定しており、この処理はメインス
 レッド上で実行する必要があります。
●isStarted()
- Loaderが開始状態かどうかを返します。
- Trueである場合はstartLoadingが呼び出されており、まだstopLoadingまたはresetが
 コールされていない状態であることを意味します。
●isAbandoned()
- このLoaderが不要となったかどうかを返します。
- abandon状態のLoaderは現在のデータを保持しますが、それが更新されたとしてもユーザ
 に通知しません。
●isReset()
- Loaderがリセット状態かどうかを返します。
- Trueである場合はLoaderがまだ1度も開始されていない状態、またはresetが既にコー
 ルされている状態などがあります。
以上です。