Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to make generic retrofit library for api calling

i'm working on API integration. i want to make generic class for API integration. which can comfortable with for all API integration.right now i'm using separate code for all API. i'm new in android application development. so please guide me.

 public void getHomeCategoryDetailApi(Context context) {
    final ProgressDialog loadingDialog = ProgressDialog.show(context, "Please wait", "Loading...");
    Retrofit restAdapter = ApiLists.retrofit;
    ApiLists apiCall = restAdapter.create(ApiLists.class);
    Call<HomeCategoryModelClass> call = apiCall.homePageCatListAPI();
    Log.d(TAG, "CategoryDetail : " + call.request()+" \n"+apiCall.homePageCatListAPI().toString());

    call.enqueue(new Callback<HomeCategoryModelClass>() {
        @Override
        public void onResponse(Call<HomeCategoryModelClass> call, Response<HomeCategoryModelClass> response) {
            Log.d(TAG, "onResponse: CategoryDetail:" + response.body());
            Log.d(TAG, "onResponse:  response.code():" + response.code());
            if (response.body() == null) {
                loadingDialog.dismiss();
                globalClass.showAlertDialog(getActivity(), getString(R.string.InternetAlert), getString(R.string.InternetMessage), false);
            } else {
                loadingDialog.dismiss();
                if (response.body().getStatusCode().equalsIgnoreCase("1")) {
                    homeCategoryImageMenu = (ArrayList<Menu>) response.body().getMenu();
                    thirdHorizontalRecyclerAdapter.notifyDataSetChanged();
                } else {
                    globalClass.showAlertDialog(getActivity(), "Alert", "" + response.body().getStatus(), false);
                }
            }
            if (response.errorBody() != null) {
                try {
                    Log.d(TAG, "onResponse: response.errorBody()===>" + response.errorBody().string());
                    if (loadingDialog.isShowing() && loadingDialog != null) {
                        loadingDialog.dismiss();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        @Override
        public void onFailure(Call<HomeCategoryModelClass> result, Throwable t) {
            Log.d(TAG, "onFailure: " + result.toString());
            loadingDialog.dismiss();
            globalClass.showAlertDialog(getActivity(), getString(R.string.InternetAlert), getString(R.string.InternetMessage), false);
        }
    });

}
like image 735
webaddicted Avatar asked Dec 06 '25 04:12

webaddicted


2 Answers

Here is Bast Way to call API

public class APIResponse {
private static String TAG = APIResponse.class.getSimpleName();

public static <T> void callRetrofit(Call<T> call, final String strApiName, Context context, final ApiListener apiListener) {
    final ProgressDialog progressDialog = new ProgressDialog(context);
    progressDialog.setMessage("Loading...");
    progressDialog.setCancelable(false);
    progressDialog.show();

    call.enqueue(new Callback<T>() {
        @Override
        public void onResponse(Call<T> call, Response<T> response) {
            if (strApiName.equalsIgnoreCase("LoginApi")) {

                if (response.isSuccessful()) {
                    Log.d(TAG, "onResponse: " + response.body().toString());
                    //  NearByNurse nearByNurse = (NearByNurse) response.body(); // use the user object for the other fields
                    // apiListener.success(url,nearByNurse);
                    progressDialog.dismiss();
                } else {
                    try {
                        Log.d(TAG, "onResponse: " + response.errorBody().string());
                        apiListener.error(strApiName, response.errorBody().string());
                        progressDialog.dismiss();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            } else if (strApiName.equalsIgnoreCase("")) {
                //Patient user = (Patient) response.body();
            }
        }

        @Override
        public void onFailure(Call<T> call, Throwable t) {
            Log.d(TAG, "onFailure: " + t.toString());
            if (strApiName.equalsIgnoreCase("searchNearbyTest")) {
                apiListener.failure(strApiName, t.toString());
            }
            progressDialog.dismiss();
        }
    });
}

In API Calling Side

private void loginApi() {
    Retrofit retrofit = ApiLists.retrofit;
    ApiLists apiList = retrofit.create(ApiLists.class);
    Call<JsonElement> loginApiCall = apiList.loginApi("kjdf", "fkldngdkl", "lkfdxngl", "kjngn", "jksdgkj");
    APIResponse.callRetrofit(loginApiCall, "LoginApi", LoginActivity.this, this);
}
@Override
public void success(String strApiName, Object response) {
    if (strApiName.equals("LoginApi")) {
    }
}

@Override
public void error(String strApiName, String error) {
    if (strApiName.equals("LoginApi")) {

    }
}

@Override
public void failure(String strApiName, String message) {
    if (strApiName.equals("LoginApi")) {

    }

and interface call on API response.

public interface ApiListener {
void success(String strApiName, Object response);
void error(String strApiName, String error);
void failure(String strApiName, String message);
 }
like image 172
webaddicted Avatar answered Dec 07 '25 21:12

webaddicted


This's my common function basic call Api.java

public class Api {
private void basicCall(Call<DataResponse> call) {
    if (call == null) {
        listener.onResponseCompleted(Config.STATUS_404, "404 not found", null);
        return;
    }
    call.enqueue(new Callback<DataResponse>() {
        @Override
        public void onResponse(@NonNull Call<DataResponse> call, @NonNull Response<DataResponse> response) {
            int code = response.code();
            //Check http ok
            if (code == HttpURLConnection.HTTP_OK) {
                //Check status
                if (response.body().getStatus() == Config.STATUS_OK) {
                    //Everything's OK
                    listener.onResponseCompleted(Config.STATUS_OK, response.body().getError(), response.body().getData());
                } else {
                    listener.onResponseCompleted(Config.STATUS_FAILED, response.body().getError(), null);
                }
            } else if (code == HttpURLConnection.HTTP_UNAUTHORIZED) {
                try {
                    ErrorResponse error = Api.gson.fromJson(response.errorBody().string(), ErrorResponse.class);
                    listener.onResponseCompleted(Config.STATUS_401, error.getError(), error.getData());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                listener.onResponseCompleted(Config.STATUS_404, "404 not found", null);
            }
        }

        @Override
        public void onFailure(@NonNull Call<DataResponse> call, @NonNull Throwable t) {
            listener.onResponseCompleted(Config.STATUS_404, "404 not found", null);
        }
    });
}
//And you can use
public void getProductList(OnResponseCompleted listener) {
    this.listener = listener;
    Call<DataResponse> call = apiService.getProductList();
    basicCall(call);
}
}
//or orther function

This's ApiService.java

public interface ApiInterface {
 @POST("product/list")
 Call<DataResponse> getProductList();
}

This's OnResponseCompleted.java

public interface OnResponseCompleted {
void onResponseCompleted(int status, String error, Object data);
}
like image 35
nhonnq Avatar answered Dec 07 '25 21:12

nhonnq



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!