AsyncTaskLoaderの使い方メモ
1画面(Activity or Fragment)で複数のAsyncTaskLoaderを使うのどうするのかなぁ?的な内容をtwitterに投げたらアドバイスが返ってきたので備忘録
※2012/1/18 @vvakameさんのツッコミを受けて修正しました(あざっす
1画面(Activity or Fragment)で複数のAsyncTaskLoaderを使うのどうするのかなぁ?的な内容をtwitterに投げたらアドバイスが返ってきたので備忘録
※2012/1/18 @vvakameさんのツッコミを受けて修正しました(あざっす
AsyncTaskLoaderを使う場合、ClassにLoaderCallbaks<D>をimplementしてやる必要があります
(参考サイト:時代は AsyncTask より AsyncTaskLoader : ぐま あーかいぶ)
(参考サイト:AsyncTaskLoaderに手を出してみる : Nkzn.net Blog)
例えば下記のような感じ
答え↓
はい、おっしゃる通りです。
やり方は他にもあると思いますが、手っ取り早いのは、Activity(Fragment)とは別のクラスでLoaderCallbacksを受け取って、Activityはそのインターフェイスを実装してやるのが簡単そうです
例:こんな感じ?
使いまわすなら、Interfaceと各AsyncTaskLoaderを処理するクラスを別ファイルにしてしまうのもアリだと思われます
※ツッコミ等あればお願いします
(参考サイト:時代は AsyncTask より AsyncTaskLoader : ぐま あーかいぶ)
(参考サイト:AsyncTaskLoaderに手を出してみる : Nkzn.net Blog)
例えば下記のような感じ
public class HogeActivity extends Activity
implements LoaderCallbacks<String>
じゃあ、Stringを返すAsyncTaskLoaderとIntegerを返すAsyncTaskLoaderを1つのActivityで使いたい場合はどうするの?答え↓
@ryosms 何故 Activity implements LoaderCallbacks しないといけないんですか? Hoge implements LoaderCallbacks じゃだめなんですか?
— わかめさん (@vvakame) 1月 14, 2012
はい、おっしゃる通りです。
やり方は他にもあると思いますが、手っ取り早いのは、Activity(Fragment)とは別のクラスでLoaderCallbacksを受け取って、Activityはそのインターフェイスを実装してやるのが簡単そうです
例:こんな感じ?
// HogeActivity.java
public class HogeActivity extends Activity implements MyLoaderCallbacks {
...
// MyLoaderCallbackのインターフェイス実装
public void AsyncLoader1Callbacks(...) {
// TODO 実装
}
public void AsyncLoader2Callbacks(...) {
// TODO 実装
}
}
// インターフェイス定義
interface MyLoaderCallbacks {
public void AsyncLoader1Callbacks(...);
public void AsyncLoader2Callbacks(...);
}
// AsyncTaskLoader<String>用クラス
class AsyncLoader1Class implements LoaderCallbacks<String> {
private MyLoaderCallbacks mInterface;
public AsyncLoader1Class(MyLoaderCallbacks myInterface) {
this.mInterface = myInterface;
}
@Override
public Loader<String> onCreateLoader(int arg0, Bundle arg1) {
...
}
@Override
public void onLoadFinished(Loader<String> arg0, String arg1) {
...
// ここでActivityにコールバック
mInterface.AsyncLoader1Callbacks(...);
}
@Override
public void onLoaderReset(Loader<String> arg0) {
...
}
}
// AsyncTaskLoader<Integer>用のクラスも同じように定義
使いまわすなら、Interfaceと各AsyncTaskLoaderを処理するクラスを別ファイルにしてしまうのもアリだと思われます
※ツッコミ等あればお願いします
コメント
コメント一覧 (1)
Activityではなく、Fragmentですけど、
これと一緒のことを実装しようとして、できませんでした。
Cyclic inheritance involvingというエラーがでるんですが、
解決方法はありますか?
もしくはもっと詳しく書かれたサンプルコードがあると助かります。。よろしくお願いします!