NO_NAME

適当に技術・仕事・ライフハックの話を書いていく予定です。

Loader API と AsyncTask の比較

Android 3.0 から Loader API が導入された。
Support Package を利用するとAndroid 1.5以上でもこのAPIを使えるようになる。

Loader API が AsyncTask と立ち位置が重なるように思えたので AsyncTask との比較してみた。

AsyncTaskとの比較しての結論

結論からいうと 読み込み処理では AsyncTask を使うより、こちらの API を利用した方がコードの再利用性、コードの読みやすさ、保守性が高くなりそうだ。
特にデフォルトで存在する CursorLoader が利用できるなら、これを利用した方が良いだろう。

読み込み処理については、

  • 名前が Loader であること
  • Loader#reset() など読み込みにしか利用しないようなメソッドがついている

ことから適さないと思う。

AsyncTaskとの比較

  • AsyncTask#onPostExecute() ではUIの操作を伴うことが多く、そのため特定の Activity や Fragment と密接に絡みあってしまうことになる。 Loader では処理終了時の操作はコールバックに書くことになるので、Loader を特定の Activity や Fragment に依存しない再利用性が高いクラスとして利用することができる。
  • Loader APIでは Activity や Fragment の停止・開始に合わせ、LoaderManager が適宜 Loader の状態を管理するため、AsyncTask 実行でよく問題になる破棄されている Activity にアクセスしてしまいエラーになる問題を避けられる。
    また、Activity 破棄後、実行終えていない AsyncTask が実行されるまでメモリを逼迫するということも起きない。
  • きちんと実装されている Loader はロード対象としたデータが変更された場合、自動的にロードし直す機能がついているなど AsyncTask にはない機能もついている。

(参考)Loader API とは

Activity や Fragment で非同期に容易にデータをロードするためのAPI

Loader は単体で利用することもできるが LoaderManager と合わせて利用することを想定している。
LoaderManager は Activity や Fragment で利用されることを想定しており、Loader も基本的には Activity や Fragment で利用することになる。