AsyncTaskLoaderの使い方メモ

1画面(Activity or Fragment)で複数のAsyncTaskLoaderを使うのどうするのかなぁ?的な内容をtwitterに投げたらアドバイスが返ってきたので備忘録

※2012/1/18 @vvakameさんのツッコミを受けて修正しました(あざっす
AsyncTaskLoaderを使う場合、ClassにLoaderCallbaks<D>をimplementしてやる必要があります
(参考サイト:時代は AsyncTask より AsyncTaskLoader : ぐま あーかいぶ
(参考サイト:AsyncTaskLoaderに手を出してみる : Nkzn.net Blog
 
例えば下記のような感じ
public class HogeActivity extends Activity
        implements LoaderCallbacks<String>
じゃあ、Stringを返すAsyncTaskLoaderとIntegerを返すAsyncTaskLoaderを1つのActivityで使いたい場合はどうするの?
答え↓



はい、おっしゃる通りです。
やり方は他にもあると思いますが、手っ取り早いのは、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を処理するクラスを別ファイルにしてしまうのもアリだと思われます
※ツッコミ等あればお願いします