そのため、Retrofit 2 を使用してすべての API 呼び出しを作成しています。
これが私のプロジェクト内のコード例です。まずはアピ。
public class Api {
public static final String BASE_URL = "http://www.api.com/";
public static final String kApiUserLogin = "user/login/";
public static final String kApiUserRegister = "user/register/";
private static ApiInterface sService;
public static ApiInterface client() {
if (sService == null) {
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
.create();
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
sService = retrofit.create(ApiInterface.class);
}
return sService;
}
public interface ApiInterface {
@POST(kApiUserLogin)
Call<UserResponse> loginUser(@Body UserDTO userDTO);
@POST(kApiUserRegister)
Call<UserResponse> registerUser(@Body UserDTO userDTO);
}}
}
そして、これは私がそれを使用する方法です:
Call<UserResponse> call = Api.client().registerUser(user);
call.enqueue(new Callback<UserResponse>() {
@Override
public void onResponse(Response<UserResponse> response) {
UserResponse userResponse = response.body();
if (userResponse.getError() == null) {
UserDTO userDto = userResponse.getUser();
User.getInstance().setUserDTO(userDto);
Intent intent = new Intent(getActivity(), MainActivity.class);
startActivity(intent);
} else {
dialog
.setTitleText("Error")
.setContentText(userResponse.getError())
.setConfirmText("OK")
.changeAlertType(SweetAlertDialog.ERROR_TYPE);
}
}
@Override
public void onFailure(Throwable t) {
Log.d("CallBack", " Throwable is " + t);
dialog.hide();
}
});
Call<UserResponse> call = Api.client().loginUser(user);
call.enqueue(new Callback<UserResponse>() {
@Override
public void onResponse(Response<UserResponse> response) {
UserResponse userResponse = response.body();
if (userResponse.getError() == null) {
UserDTO userDto = userResponse.getUser();
User.getInstance().setUserDTO(userDto);
Intent intent = new Intent(getActivity(), MainActivity.class);
startActivity(intent);
} else {
dialog
.setTitleText("Error")
.setContentText(userResponse.getError())
.setConfirmText("OK")
.changeAlertType(SweetAlertDialog.ERROR_TYPE);
}
}
@Override
public void onFailure(Throwable t) {
Log.d("CallBack", " Throwable is " + t);
dialog.hide();
}
});
}
問題は、内部のelse
セクションのコードを再利用できるようにするにはどうすればよいかということです。これはほんの一例です。アプリ全体で多くの API 呼び出しがあるため、この 2 つのメソッドの下で呼び出されるメソッドを作成できるわけではありません。if (userResponse.getError() == null)
onReponse
デフォルトの onResponse ハンドラまたは Api クラス内のそのようなものをもっと探していましたか??
同時に、onFailure
コースについても同じことをしたいと思います。
多分私は非常に単純なものを複雑にしすぎています...