【Android】Volleyで通信をしよう(StringRequest編)

Google社員が作った通信ライブラリVolleyの紹介です。
機能が多いので、今回はStringRequestに限定します。

使うメリット

Googleによる検証で最速の通信ライブラリらしいです。
フルスクラッチで書くより早い?!

使い方

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