Android ではアクティビティ内に通信処理を直接書くとコンパイルできない。
仕方がないのでスレッド生成して書こうとしたら、AsyncTask で処理をしろと神様(Android SDK)がおっしゃってる。
案の定Web上には、中途半端なソースしかない。
サンプルを参考にしながら使い回しができるクラスを書いた。
SandBoxAsyncTask.java
/** * 非同期タスクでSandBoxにアクセスする * @author Ryan's Factory * @since 2014/10/01 */ public class SandBoxAsyncTask extends AsyncTask<SandBox.Requestor, Void, String> { /** * コンテキスト */ private Context context; /** * コールバック */ private SandBoxAsyncTaskCallback callback; /** * 通信処理クラス */ private SandBox sandbox; /** * コンストラクタ */ @SuppressWarnings("unused") private SandBoxAsyncTask() {}; /** * コンストラクタ * @param context コンテキスト * @param sandbox 通信処理クラス * @param callback コールバック */ public SandBoxAsyncTask(Context context, SandBox sandbox, SandBoxAsyncTaskCallback callback) { this.context = context; this.sandbox = sandbox; this.callback = callback; } /** * 通信処理を行なう前に呼び出される */ @Override protected void onPreExecute() { callback.onPreExecuteSandBox(context,sandbox.getProgress()); } /** * 通信処理を呼び出す */ @Override protected String doInBackground(SandBox.Requestor... params) { return sandbox.request(params); } /** * 通信処理が完了した */ @Override protected void onPostExecute(String result) { if( sandbox.isSuccess() ) { // 取得できた callback.onSuccessSandBox(result,context,sandbox.getProgress()); } else { // 取得できなかった callback.onFailedSandBox(sandbox.getErrorCode(),context,sandbox.getProgress()); } } }
AsyncTask<SandBox.Requestor, Void, String>
第一パラメータ SandBox.Requestor:通信処理を実行する関数に渡されるパラメータ
サンドボックスクラス内で宣言する。
第二パラメータ Void:処理中に何かしたいとき中断とか、だけど実装しないのでVoidにする
第三パラメータ String:処理終了後にわたされるパラメータ
JSONデータが目的なのでStringにする
インターフェイスについては次へ