【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)