複数の通信があって戻り値のパターンが各通信毎にある場合を想定しています。
通信結果はJSONで受けとります。
AsyncTaskにはバグがあるという噂なので新しいAsyncTaskLoaderを使います。
AsyncTaskLoaderについて
- 時代は AsyncTask より AsyncTaskLoader
http://archive.guma.jp/2011/11/-asynctask-asynctaskloader.html
※4以外は実装可能か試していません
1. 1つのAsyncTaskLoaderを使い戻り値はJSONにする。JSON→欲しい戻り値にするメソッドは別のクラスにまとめる
メリット
- 単純な作りなのでわかりやすい
- 通信クラスのソース量がすくない
デメリット
- JSON→欲しい戻り値にするメソッドとURLの対応表がどこかに必要でソースから追うことができない
- 上記が必要なので最初とっつきにくそう
2. 1つのAsyncTaskLoaderを使い戻り値は総称型にする
AsyncTaskLoader内の処理はIDで分ける
###メリット
- AsyncTaskLoaderを作った人が意図した使い方のような気がする。
###デメリット
- どんなObjectが返ってくるのか調べるために通信側のソースまたは他の呼び出し部分を参考にする必要がある。
3. 各通信毎にAsyncTaskLoaderを用意する
メリット
- 作りが単純
- どんな戻り値が返ってくるのか明確
デメリット
- Loaderクラスの数がかなり多くなる
- 似たソースがかなり多くなってしまう
4. 通信クラスを作って各通信毎にメソッドを用意。戻り値は各通信のメソッド毎にインターフェースを用意する。内部の実装はAsyncTaskLoader
非同期で結果を受け取る方法
http://qiita.com/ux_design_tokyo/items/2c742c792093bc607be6
ActivityまたはFragmentではなく通信クラスをAsyncTaskLoaderのコールバック先にする。
メリット
- どんな戻り値が返ってくるのか明確
デメリット
- インターフェースを各メソッド毎に書くので少しソース量が多くなる
どの方法で実装する?
ソースは若干増えますが、メソッドを使う側がわかりやすい4で実装してみようと思います。
実際に実装してみました