[Android] RxJavaを使わずにOkHttp3でシンプルに通信処理を書いてみる

2016.03.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

OkHttpのバージョンが3になりいくつか変更点がありましたので変更点も含めてOkHttpの使い方をご紹介します。
Rxを使わずシンプルにOkHttpだけで通信処理をしています。
今回もいつもと同じopenweathermapを使っています。

OkHttp2とOkHttp3の違い

まず OkHttpの使い方のおさらいです。
- Requestオブジェクト作る
- OkHttpオブジェクト作る
- enqueue()メソッドにコールバックを定義する

[OkHttp2]

        Request request = new Request.Builder()
                .url("http://api.openweathermap.org/data/2.5/weather?id=2172797&APPID=464b981be2248f383ab898810xxxxxxx")
                .get()
                .build();
        OkHttpClient client = new OkHttpClient();
                client.setReadTimeout(15 * 1000, TimeUnit.MILLISECONDS);
                client.setConnectTimeout(20 * 1000, TimeUnit.MILLISECONDS);
                client.setWriteTimeout(20 * 1000, TimeUnit.MILLISECONDS);
                client.interceptors().add(new StethoInterceptor());
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {

            }

            @Override
            public void onResponse(Response response) throws IOException {

            }
        });
    compile 'com.squareup.okhttp:okhttp:2.4.0'

1-4行目でRequesturl()でurlを指定して、get()でHTTPメソッドを指定しています。post()メソッドやput()メソッドもあります。
他にも必要であればaddHeader()cacheControl()メソッドでヘッダーに必要な情報を追加することができます。

5-9行目でOkHttpClientにはタイムアウトの設定をしてInterceptorをセットしています。
stethoについてはこちらの弊社ブログをご覧ください。

11行目でnewCall()メソッドでCallオブジェクトを取得してenqueue()でキューへ送っています。
enqueue()メソッドの引数にCallbackを定義して結果をハンドリングをします。
enqueue()ではなくexecute()と書くと

android.os.NetworkOnMainThreadException

が発生します。
AsyncTaskなどで非同期で実行する場合はexecute()と書くことができます。

[OkHttp3]

        Request request = new Request.Builder()
                .url("http://api.openweathermap.org/data/2.5/weather?id=2172797&APPID=464b981be2248f383ab898810xxxxxxx")
                .get()
                .build();

        OkHttpClient client = new OkHttpClient().newBuilder()
                .readTimeout(15 * 1000, TimeUnit.MILLISECONDS)
                .writeTimeout(20 * 1000, TimeUnit.MILLISECONDS)
                .connectTimeout(20 * 1000, TimeUnit.MILLISECONDS)
                .addNetworkInterceptor(new StethoInterceptor())
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

            }
        });
    compile 'com.squareup.okhttp3:okhttp:3.0.1'

Timeoutの設定やInterceptor()のセットはOkHttpClient().newBuilder()で行うようになりました。
またCallbackでCallオブジェクトが渡されるようになりました。
ここで渡されるCallオブジェクトは13行目でenqueue()メソッドでキューへ送ったCallオブジェクトが渡されるのでcall.cancelcall.enqueueといったハンドリングができます。

最後に

他にもCookieの扱いやFormMultipart周りがOkHttp3で変更されたので後日紹介します。