【Android】Volleyで通信をしよう(GsonRequest編)
投稿する順番間違えたorz
今回はVolleyを使ってJson形式のデータをやり取りします。
使用するメリット
処理速度が早いVolleyとGsonを組み合わせたら早くて便利
ソースコード
dependencies
compile 'eu.the4thfloor.volley:com.android.volley:2015.05.28' compile 'com.google.code.gson:gson:2.3.1'
public class AppController extends Application { public RequestQueue mRequestQueue; @Override public void onCreate() { super.onCreate(); mRequestQueue = Volley.newRequestQueue(getApplicationContext()); } }
実際に処理している部分
@OnClick(R.id.btn_request) protected void onClick(View view) { AppController application = (AppController)getApplication(); GsonRequest<JsonResponseModel> request = new GsonRequest("http://localhost:8080/", JsonResponseModel.class, null, makeParameter(), new Response.Listener() { @Override public void onResponse(Object response) { JsonResponseModel model = (JsonResponseModel)response; // あとはよしなに } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show(); } }); application.mRequestQueue.add(request); }
GsonRequest
JsonResponseModelは正常終了時の型を指定します。
あとはQueueに足せば終了です。
Gsonでやり取りするクラス
一部書きかえていますが、下記のソースを使用しています。
https://gist.github.com/ficusk/5474673
public class GsonRequest<T> extends Request<T> { private final Gson gson = new Gson(); private final Class<T> clazz; private final Map<String, String> headers; private final Map<String, String> params; // 追加 private final Listener<T> listener; /** * Make a GET request and return a parsed object from JSON. * * @param url URL of the request to make * @param clazz Relevant class object, for Gson's reflection * @param headers Map of request headers * @param params リクエストパラメータ(追加) */ public GsonRequest(String url, Class<T> clazz, Map<String, String> headers, Map<String, String> params, Listener<T> listener, ErrorListener errorListener) { super(Method.GET, url, errorListener); this.clazz = clazz; this.headers = headers; this.listener = listener; this.params = params; } @Override public Map<String, String> getHeaders() throws AuthFailureError { return headers != null ? headers : super.getHeaders(); } @Override protected void deliverResponse(T response) { listener.onResponse(response); } @Override protected Response<T> parseNetworkResponse(NetworkResponse response) { try { String json = new String( response.data, HttpHeaderParser.parseCharset(response.headers)); return Response.success( gson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JsonSyntaxException e) { return Response.error(new ParseError(e)); } } @Override protected Map<String, String> getParams() throws AuthFailureError { return params; } }
追加ってコメントしている部分が変更箇所です。
レスポンスモデル
public class JsonResponseModel { @SerializedName("user_name") private String userName; private String age; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } }
ここは普通にGsonで使うのと同じように作ります。
この記事のアプリの動作確認用にGoで以下の記事を書いています。
http://soba-ha-kenkou.hatenablog.com/entry/2015/09/29/224732
今回のソースコード一式は以下にあります。
https://github.com/k-shimoju/android/tree/master/Volley(GSON)