Support LibraryでLoaderを使ってみた

先日Androidの開発環境を新しくしたら初期作成できるアプリの雛形が増えてた。

  • Tab
  • Dropdown
  • Tab and Swipe
  • Swipe and Title

これは便利と早速試してみようとしたんだけど、これってminSdkVersionがAndroid3系以上じゃないとそもそも選択できないみたい。まだまだ2系って主流だからそれを切り捨てて使うことはできないんで、SupportV4使ってどうにかできないものかと調べてみた。supportV4のrefarenceは以下のURLに乗っている。

ActionBarってSupportV4で対応したかなぁと思ってたんだけど、まだ対応してないみたいね。。。

The ActionBar is not supported by the library. However, when creating your Options Menu, you can declare which items should be added to the Action Bar when it’s available (on Android 3.0 or later). You can do so with the MenuCompat.setShowAsAction() method, for example:

ActionBarはまだ対応してないけど、MenuCompat.setShowAsAction()を使ってOptionMenuで入れてる奴は2系だとOptionボタンで、Android4系だとActionBarに表示されますよって意味かな。ActionBarはAndroid2系では完全に諦めるとして、他にSupportV4でどういうことができるようになるのか?って言うことなんだけど、以下のClassに対応したって書いてある。

  • Fragment
  • FragmentManager
  • FragmentTransaction
  • ListFragment
  • DialogFragment
  • LoaderManager
  • Loader
  • AsyncTaskLoader
  • CursorLoader

FragmentとLoaderに対応したのかー。FragmentはSwipeで使ったことあるけど、Loaderってつかったことないからちょっと調べてみた。Loaderがどんなものかってのは以下にのってる。

Loaders | Android Developers

ざっくり読んだところ、バックグラウンドでデータを取得することができますよって感じっぽい。まぁ、名前からしてそうですね。AsyncTaskのデータ取得に特化したものって考えればいいのかな。ContentProviderからデータを取得したい場合はCursorLoaderつかって、それ以外はAsyncTaskLoaderを使うってのが基本らしい。

んじゃ、早速コードを組んでみるかと以下を参考にLoaderを試してみた。

Android3.0以降で、AsyncTaskLoaderを利用した非同期処理を行う | Tech Booster

結果、エラー。。。コンパイルすら通らないレベル。エラー箇所は以下。

		getLoaderManager().initLoader(0, null, loaderSample);

んで、エラー文言がこんな感じ。

The method initLoader(int, Bundle, LoaderManager.LoaderCallbacks) in the type LoaderManager is not applicable for the arguments (int, null, MainActivity.LoaderSample)

エラー内容的にgetLoaderManager()で取得できているのがsupport.v4のじゃなくて、API LEVEL11以上のやつを持ってきてるっぽい。import文を書き換えたりとか色々してもだめで、頭を悩ましていたらActivityじゃ使えないらしい・・・。

SupportLibrary | DeVlog – 銀の翼で翔べ –

これにそって継承をActivityからFragmentActivityに変更して、getLoaderManager()ではなくてgetSupportLoaderManager()を使うことでsupport.v4の方のLoaderCallbacksを引数に取るようになって使うことができましたとさ。って、FragmentActivityを絶対使わないとダメだってどういう仕様なんだよっていう。

FragmentAcitivityとかPagerつかってFragmentバリバリ使ってるようなアプリだったらLoader使うことはできそうだけど、Android2系を切り捨てることができない現状としてLoaderを使うのはまだまだ先っぽい。そもそもだけど、Loader使ったらちょっと書きやすくなるっていう程度でAsyncTaskとかで代用できそうだし別に使う必要もないよね。

と、ここまで書いてリファレンスを再度読んだらFragmentActivityのを使いなさいって書いてありますね・・・。

To manage your fragments and loaders, you must use the methods FragmentActivity.getSupportFragmentManager() and FragmentActivity.getSupportLoaderManager() (instead of the getFragmentManager() and getLoaderManager() methods).

リファレンスはちゃんと読まないとダメですね。。。

参照先へのツッコミ

Android3.0以降で、AsyncTaskLoaderを利用した非同期処理を行う | Tech Booster

これに以下の記述があるけど、そんなことないよね。

Loaderを呼び出すActivity/Fragmentには、LoaderCallbacksインターフェースをimplementsする必要があります。

これは、initLoader()の第三引数にthisを渡してるからimplementsされてるだけで、別クラスを定義して第三引数に設定してあげれば全然問題なく動く。僕はActivityに複数implementsして引数にthisを渡しまくるのはあまり好きじゃないから使うなら分割して使いそう。