More Related Content
PDF
PDF
PDF
PDF
PPTX
PDF
PPTX
世界一わかりやすいClean Architecture PDF
What's hot
PDF
An Internal of LINQ to Objects PDF
PPTX
ASP.NET Core の パフォーマンスを支える I/O Pipeline と Channel PDF
3週連続DDDその1 ドメイン駆動設計の基本を理解する PDF
PPTX
PDF
Deep Dive async/await in Unity with UniTask(UniRx.Async) PPTX
PDF
PDF
PDF
PDF
メルカリ・ソウゾウでは どうGoを活用しているのか? PDF
PPTX
PDF
PDF
PDF
PDF
AWS Black Belt Techシリーズ Amazon CloudSearch PDF
PDF
Retrofit2 &OkHttp
でAndroidのHTTP通信が快適だにゃん
- 1.
- 2.
- 3.
- 4.
- 5.
- 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する
- 9.
- 10.
- 11.
- 12.
- 13.
- 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の代わりに指定する
- 17.
- 18.
private static Retrofit.builderbuilder;
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);