SlideShare a Scribd company logo
4
Most read
6
Most read
Retrofit2 & OkHttp
でAndroidのHTTP通信が快適だにゃん
1
日本Androidの会埼玉支部 @sakura_bird1
2016/01/23
さくら@sakura_bird1
ABOUT ME
• 多分ハタチ
• 野良プログラマー3年目ぐらい
• Android受託開発で糊口をしのぐ
• 最近Player!というアプリを作ってます。
もうすぐAndroid版リリース(?)
• 一生プログラマー
• 今年はSwiftやりたい
OkHttp
• Square社のHTTPクライアント(http://square.github.io/okhttp/)
• http通信が簡単に書ける
• 通信状況が悪い時は再接続してくれる
• HTTP/2 ,SPDYをサポート
• Okio(java.io)に依存
• 強力なInterceptor (request前処理,ロギング,ヘッダー,gzip圧縮 )
• コネクションプーリング、キャッシング、同期/非同期call、リダイレクト他
3
Retrofit
• Square社のHTTPクライアント用ライブラリ(http://square.github.io/retrofit/)
• REST APIをJava Interface、アノテーションの形でシンプルに書ける
• 最新のバージョンはRetrofit version2.0.0-beta3
• Retrofit2系と1系はかなり大きく違っている
• Http bodyの変換用にいくつかのselialization用ライブラリに使えるコンバーターが
用意されている(Gson, Jackson, Moshi, Protobuf, Wire, Simple XML)
• RxAndroidと相性がいいらしいがここでは割愛
4
使用例
public interface GitHubService {
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first,
@Field("last_name") String last);
}
Interfaceでエンドポイント、メソッド、パラメータを定義
Request body変換用エンティティクラスを指定
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(“https://api.github.com")
.client(httpClient)
.addConverterFactory(GsonConverterFactory.create())
.build();
GitHubService service = retrofit.create(GitHubService.class);
OkHttpClient httpClient = new OkHttpClient();
↑これがなくてもOK。自動的にOkHttpを使用する。
通信処理 Retrofit セットアップ
Retrofitのオブジェクトを生成する Request body変換用converterを指定
Call<User> task = service.updateUser(firstName, lastName);
task.enqueue(new Callback<User>() {
@Override
public void onResponse(Response<User> response, Retrofit retrofit) {
if (response != null && response.body() != null) {
// response.body()にUserクラスに変換されたオブジェクト
// が入っている
}
}
@Override
public void onFailure(Throwable t) {
}
});
APIをcallする
便利な使い方
@Headers({
"Accept: application/vnd.github.v3.full+json",
"User-Agent: Retrofit-Sample-App"
})
@GET("users/{username}")
Call<User> getUser(@Path("username") String username);
HEADER
1. Interfaceに記述する方法
Headerやendpointに変数を指定できる
HEADER
2. OkHttpのinterceptorを使って記述する方法
どのrequestでも必ず指定するヘッダーはこっちを使った方が便利
httpClient.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
Request request = original.newBuilder()
.header(“Hoge-Version”,”1.0”)
.header(“Client-OS”,”Android”)
.method(original.method(), original.body())
.build();
return chain.proceed(request);
}
});
LOGGING
LoggingInterceptorを使う
if (BuildConfig.DEBUG) {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
httpClient.networkInterceptors().add(interceptor);
}
共通処理をまとめたい
その1.エラー処理
retrofit.Callbackインターフェイスを実装し独自クラスを使う
Call<User> task = service.updateUser(firstName, lastName);
task.enqueue(new Callback<User>() {
@Override
public void onResponse(Response<User> response, Retrofit retrofit) {
}
}
@Override
public void onFailure(Throwable t) {
}
});
デフォルトのCallback<T>
このあたりに毎回同じエラー処理を書きたい
例えばこんなCallbackクラスを用意します
public class NetworkCallback<T> implements Callback<T> {
private Context mContext;
public NetworkCallback(Context context) {
mContext = context;
}
@Override
public void onResponse(Response<T> response, Retrofit retrofit) {
if (response != null && response.errorBody() != null) {
try {
if (response.code() > 400) {
String errorBody = response.errorBody().string();
Logger.e("error :" + errorBody + " code:" + response.code());
ClientHelper.ApiError apiError = ClientHelper.onApiError(response.code(), errorBody);
showDialog(mContext, mContext.getString(R.string.errorOccured), apiError.getMessage());
return;
}
} catch (IOException e) {
e.printStackTrace();
showDialog(mContext, mContext.getString(R.string.errorOccured), ClientHelper.ApiError.UNKNOWN.getMessage());
return;
}
}
if (response == null || response.body() == null) {
Logger.e("response or response body=null");
showDialog(mContext, mContext.getString(R.string.errorOccured), ClientHelper.ApiError.UNKNOWN.getMessage());
}
}
@Override
public void onFailure(Throwable t) {
if (t != null) {
t.fillInStackTrace();
Logger.e("Throwable t:" + t.getCause() + " " + t.getMessage());
} else {
Logger.e("Cound not access server");
}
showDialog(mContext, mContext.getString(R.string.errorOccured), ClientHelper.ApiError.OFFLINE.getMessage());
}
}
UserClient client = ClientHelper.createService(UserClient.class);
Call<User> task = client.show();
task.enqueue(new NetworkCallback<User>(mContext) {
@Override
public void onResponse(Response<User> response, Retrofit retrofit) {
super.onResponse(response, retrofit);
if (response != null && response.errorBody() != null) {
return;
}
if (response != null && response.body() != null) {
// somethings
}
}
@Override
public void onFailure(Throwable t) {
super.onFailure(t);
}
});
デフォルトのCallbackの代わりに指定する
共通処理をまとめたい
その2.Retrofitにセットする値はいつも同じ
汎用メソッドを用意しておく
private static Retrofit.builder builder;
public static <S> S createService(Class<S> serviceClass) {
builder.baseUrl(PlayerApplication.getContext().getString(R.string.API_BASE_URL));
Retrofit retrofit = builder
.client(httpClient)
.addConverterFactory(GsonConverterFactory.create())
.build();
return retrofit.create(serviceClass);
}
汎用メソッド
汎用メソッドを使ってオブジェクトを生成
UsersClient client = ClientHelper.createService(UsersClient.class);

More Related Content

KEY
コードで学ぶドメイン駆動設計入門
PDF
できる!並列・並行プログラミング
PPTX
講演資料: コスト最適なプライベートCDNを「NGINX」で実現するWeb最適化セミナー
PPTX
設計と実装で 抑えておきたい サービスクラスと例外
PDF
グラフデータベース:Neo4j、そしてRDBからの移行手順の紹介
PDF
これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~
PDF
F#入門 ~関数プログラミングとは何か~
PDF
AndroidアプリのKotlin移行時に遭遇した問題と対処例
コードで学ぶドメイン駆動設計入門
できる!並列・並行プログラミング
講演資料: コスト最適なプライベートCDNを「NGINX」で実現するWeb最適化セミナー
設計と実装で 抑えておきたい サービスクラスと例外
グラフデータベース:Neo4j、そしてRDBからの移行手順の紹介
これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~
F#入門 ~関数プログラミングとは何か~
AndroidアプリのKotlin移行時に遭遇した問題と対処例

What's hot (20)

PDF
llvm入門
PPTX
C# 8.0 非同期ストリーム
PDF
MapReduce入門
PDF
WebAssemblyのWeb以外のことぜんぶ話す
PDF
勉強か?趣味か?人生か?―プログラミングコンテストとは
PPTX
地獄のElixir(目黒スタートアップ勉強会)
PDF
【de:code 2020】 そのロジック、IoT Edge で動きます - Azure IoT Edge 開発 Deep Dive
PDF
イミュータブルデータモデル(世代編)
PPTX
Modele mvc
PDF
GLSLによるシェーダーアートことはじめ
PPTX
グラフデータベース入門
PDF
pixivのインフラを支える技術
PDF
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
PDF
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
PDF
Cassandraとh baseの比較して入門するno sql
ODP
MVC の Model を考える
PDF
DI(依存性注入)について
PDF
BigQueryの課金、節約しませんか
PDF
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
llvm入門
C# 8.0 非同期ストリーム
MapReduce入門
WebAssemblyのWeb以外のことぜんぶ話す
勉強か?趣味か?人生か?―プログラミングコンテストとは
地獄のElixir(目黒スタートアップ勉強会)
【de:code 2020】 そのロジック、IoT Edge で動きます - Azure IoT Edge 開発 Deep Dive
イミュータブルデータモデル(世代編)
Modele mvc
GLSLによるシェーダーアートことはじめ
グラフデータベース入門
pixivのインフラを支える技術
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Cassandraとh baseの比較して入門するno sql
MVC の Model を考える
DI(依存性注入)について
BigQueryの課金、節約しませんか
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
Ad

Similar to Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん (20)

PDF
Implements OpenTelemetry Collector in DotNet
PDF
勉強会force#4 Chatter Integration
PDF
RとWeb API
PDF
Goji とレイヤ化アーキテクチャ
PPTX
Web socket and gRPC
PDF
Python physicalcomputing
PDF
gumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作る
PDF
Swift - Result&lt;t>型で結果を返すのは邪道か,王道か
PPT
Inside mobage platform
PPTX
HTML5&API総まくり
PPTX
.NET Core 2.x 時代の C#
PDF
Ajax 応用
PDF
Reactive Extensionsで非同期処理を簡単に
PDF
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring
PDF
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
PDF
Pfi Seminar 2010 1 7
PDF
Data APIの基本
PDF
Connect with Data API
PPTX
Polyphony の行く末(2018/3/3)
PDF
20130315 abc firefox_os
Implements OpenTelemetry Collector in DotNet
勉強会force#4 Chatter Integration
RとWeb API
Goji とレイヤ化アーキテクチャ
Web socket and gRPC
Python physicalcomputing
gumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作る
Swift - Result&lt;t>型で結果を返すのは邪道か,王道か
Inside mobage platform
HTML5&API総まくり
.NET Core 2.x 時代の C#
Ajax 応用
Reactive Extensionsで非同期処理を簡単に
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
Pfi Seminar 2010 1 7
Data APIの基本
Connect with Data API
Polyphony の行く末(2018/3/3)
20130315 abc firefox_os
Ad

Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん