More Related Content
講演資料: コスト最適なプライベートCDNを「NGINX」で実現するWeb最適化セミナー 設計と実装で 抑えておきたい サービスクラスと例外 グラフデータベース:Neo4j、そしてRDBからの移行手順の紹介 これで怖くない!?大規模環境で体験するDB負荷対策~垂直から水平の彼方へ~ AndroidアプリのKotlin移行時に遭遇した問題と対処例 What's hot (20)
WebAssemblyのWeb以外のことぜんぶ話す 勉強か?趣味か?人生か?―プログラミングコンテストとは 【de:code 2020】 そのロジック、IoT Edge で動きます - Azure IoT Edge 開発 Deep Dive ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版 OSTree: OSイメージとパッケージシステムの間にGitのアプローチを SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版) Cassandraとh baseの比較して入門するno sql macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~ Similar to Retrofit2 &OkHttp
でAndroidのHTTP通信が快適だにゃん (20)
Implements OpenTelemetry Collector in DotNet 勉強会force#4 Chatter Integration gumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作る Swift - Result<t>型で結果を返すのは邪道か,王道か Reactive Extensionsで非同期処理を簡単に Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方 Retrofit2 &OkHttp
でAndroidのHTTP通信が快適だにゃん
- 6. public interface GitHubService {
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first,
@Field("last_name") String last);
}
Interfaceでエンドポイント、メソッド、パラメータを定義
Request body変換用エンティティクラスを指定
- 7. 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を指定
- 8. 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する
- 14. 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>
このあたりに毎回同じエラー処理を書きたい
- 15. 例えばこんな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());
}
}
- 16. 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の代わりに指定する
- 18. 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);