【Android】Volleyで通信をしよう(StringRequest編)
Google社員が作った通信ライブラリVolleyの紹介です。
機能が多いので、今回はStringRequestに限定します。
使い方
gradleの設定
build.gradleに以下を記載します。
compile 'eu.the4thfloor.volley:com.android.volley:2015.05.28'
Applicationクラスの子クラスを作成
public class AppController extends Application { public RequestQueue mRequestQueue; @Override public void onCreate() { super.onCreate(); mRequestQueue = Volley.newRequestQueue(getApplicationContext()); } }
RequestQueueをシングルトンかつ、早めにインスタンス生成するためにここに書きます。
※個人的にはRequestQueueをprivateにしてgetter作る方が好きですが、手抜きしました。
Getリクエスト用のクラスを作成
public class GetRequest extends StringRequest { private Map<String, String> mParams; private static final String URL = "http://api.openweathermap.org/data/2.5/weather"; public GetRequest(Response.Listener<String> listener, Response.ErrorListener errorListener, Map<String, String> mParams) { super(Method.GET, URL, listener, errorListener); this.mParams = mParams; } @Override public String getUrl() { return super.getUrl() + makeGetParameter(); } private String makeGetParameter() { String param = "?"; boolean isFirst = true; for (Map.Entry<String, String> entry : mParams.entrySet()) { if (isFirst) { param += entry.getKey() + "=" + entry.getValue(); } else { param += "&" + entry.getKey() + "=" + entry.getValue(); } } return param; } }
※ここではgetUrlをオーバーライドしてますが、パラメータ付きのurlを引数に受ける作りで問題ないです。
Postリクエスト用のクラスを作成
public class PostRequest extends StringRequest { private Map<String, String> mParams; private static final String URL = "http://ave.bolyartech.com/params.php"; public PostRequest(Response.Listener<String> listener, Response.ErrorListener errorListener, Map<String, String> params) { super(Method.POST, URL, listener, errorListener); mParams = params; } @Override protected Map<String, String> getParams() throws AuthFailureError { return mParams; } }
※Postリクエストにパラメータ付与するにはgetParamsメソッドをオーバーライドして、Map形式で返してあげるようにします。
Getリクエストを投げます。
@OnClick(R.id.btn_get) protected void btnGet(View view) { Map<String, String> params = makeParameter(); AppController app = (AppController)getApplication(); GetRequest request = new GetRequest(new Response.Listener<String>() { @Override public void onResponse(String response) { txtResult.setText(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show(); } }, params); app.mRequestQueue.add(request); }
※ここでStringRequestをnewしてあげれば、上記GetRequestクラスは無くても平気です。
⇒個人的にはクラス作るのが良いと思ってるだけです。
あと、解説するのに見やすい(はず)
Postリクエストを投げます。
@OnClick(R.id.btn_post) protected void btnPost(View view) { Map<String, String> params = makeParameter(); AppController app = (AppController)getApplication(); PostRequest request = new PostRequest(new Response.Listener<String>() { @Override public void onResponse(String response) { txtResult.setText(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_SHORT).show(); } }, params); app.mRequestQueue.add(request); }
※Postリクエストもクラス化しないで、こっちに書いてもいいです。
Android3.0からUI(メイン)スレッドで通信はNGになりましたが、
裏で勝手にやってくれるのでActivityでもFragmentでも気にせず投げてください
通信処理の補足
引数に指定しているResponse.Listenerが通信が正常終了した時に呼ばれるリスナです。
なので、Response.ErrorListenerは通信エラー時に呼ばれます。
エラーリスナは共通化して、リトライダイアログを出したりしてもいいです。
(エラー内容で分岐させる)
今回はここまでですが、実際はjson形式でやりとりが多いと思うので、実はこの記事ってあまり役に立ちませんw
今回のソースコード一式は以下にあります。
https://github.com/k-shimoju/android/tree/master/volley_string