1

そのため、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コースについても同じことをしたいと思います。

多分私は非常に単純なものを複雑にしすぎています...

4

1 に答える 1

0

私の理解が正しければ、これで十分です。

   Call<UserResponse> call = Api.client().registerUser(user);
    call.enqueue(new Callback<UserResponse>() {
        @Override
        public void onResponse(Response<UserResponse> response) {
            processResponse(response.body());
        }

        @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) {
            processResponse(response.body());
        }

        @Override
        public void onFailure(Throwable t) {
            Log.d("CallBack", " Throwable is " + t);
            dialog.hide();
        }
    });
}

    private void processResponse(UserResponse userResponse) {
        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);
        }
    }
于 2016-01-22T22:29:06.813 に答える