[Android] RxJavaを使わずにOkHttp3でシンプルに通信処理を書いてみる
はじめに
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行目でRequestにurl()で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.cancelでcall.enqueueといったハンドリングができます。
最後に
他にもCookieの扱いやFormやMultipart周りがOkHttp3で変更されたので後日紹介します。