Simple Retrofit Network Calling

This example shows how to communicate between server and an android phone with Retrofit.

Dependencies

implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.google.code.gson:gson:2.8.2'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'

APIService.java

package com.a4akhilsudha.xxx.Retrofit;

import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;

public interface APIService {

    @GET("/api/get_questions.php")
    //@FormUrlEncoded
    Call<DataResponse> qstns(@Query("offset") String offset,
                             @Query("category") String category,
                             @Query("lang") String language);


    @GET("/api/get_exams.php?exam=exam")
        //@FormUrlEncoded
    Call<DataResponse_examList> examList();
}
ApiUtils.java
package com.a4akhilsudha.xxx.Retrofit;

public class ApiUtils {

    private ApiUtils() {}

    public static final String BASE_URL = "https://xxx.a4akhilsudha.com/";

    public static APIService getAPIService() {

        return RetrofitClient.getClient(BASE_URL).create(APIService.class);
    }
}

DataResponse.java

package com.a4akhilsudha.xxx.Retrofit;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

import java.util.List;

public class DataResponse {
    @SerializedName("status")
    @Expose
    private String status;
    @SerializedName("status_message")
    @Expose
    private String statusMessage;
    @SerializedName("data")
    @Expose
    private List<Questions> data = null;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getStatusMessage() {
        return statusMessage;
    }

    public void setStatusMessage(String statusMessage) {
        this.statusMessage = statusMessage;
    }

    public List<Questions> getData() {
        return data;
    }

    public void setData(List<Questions> data) {
        this.data = data;
    }

}

RetrofitClient.java

package com.a4akhilsudha.xxx.Retrofit;

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetrofitClient {

    private static Retrofit retrofit = null;

    public static Retrofit getClient(String baseUrl) {
        if (retrofit==null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(baseUrl)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

MainActivity.java

package com.a4akhilsudha.xxx.Activities;

import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.appcompat.widget.Toolbar;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Toast;
import com.a4akhilsudha.xxx.R;
import com.a4akhilsudha.xxx.Retrofit.APIService;
import com.a4akhilsudha.xxx.Retrofit.ApiUtils;
import com.a4akhilsudha.xxx.Retrofit.DataResponseImages;
import com.a4akhilsudha.xxx.Retrofit.ImagesDataProvider;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
import com.google.gson.Gson;

import java.util.ArrayList;
import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class MainActivity extends AppCompatActivity {

    Toolbar toolbar;

    APIService mAPIService;

    RecyclerView trollsRecycler;

    TrollsAdapter trollsAdapter;

    List<ImagesDataProvider> imagesDataProviderList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_trolls);

        toolbar = findViewById(R.id.toolbar);

        trollsRecycler = findViewById(R.id.trollsRecycler);

        setSupportActionBar(toolbar);

        getSupportActionBar().setTitle("PSC Trolls");

        toolbar.setTitleTextColor(Color.WHITE);

        toolbar.setNavigationIcon(R.drawable.round_arrow_back_24);

        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                onBackPressed();
            }
        });

        mAPIService = ApiUtils.getAPIService();

        imagesDataProviderList = new ArrayList<>();

        trollsAdapter = new TrollsAdapter(this, imagesDataProviderList);

        trollsRecycler.setHasFixedSize(true);

        trollsRecycler.setLayoutManager(new GridLayoutManager(this, LinearLayoutManager.VERTICAL));

        trollsRecycler.setAdapter(trollsAdapter);

        RequestData();

    }

    public void RequestData() {

        final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(TrollsActivity.this);

        LayoutInflater inflater = LayoutInflater.from(TrollsActivity.this);

        final View dialogView = inflater.inflate(R.layout.progress, null);

        dialogBuilder.setView(dialogView);

        final AlertDialog alertDialog = dialogBuilder.create();

        alertDialog.show();

        alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

        mAPIService.trolls().enqueue(new Callback<DataResponseImages>() {
            @Override
            public void onResponse(Call<DataResponseImages> call, Response<DataResponseImages> response) {

                if(response.isSuccessful()) {

                    String json = new Gson().toJson(response);

                    if (response.body().getStatus().equals("success"))
                    {

                        imagesDataProviderList.addAll(response.body().getData());

                        trollsRecycler.getAdapter().notifyDataSetChanged();


                    }

                    else if (response.body().getStatus().equals("error") && response.body().getStatusMessage().equals("no_data"))

                    {
                        Toast.makeText(TrollsActivity.this, "No data found", Toast.LENGTH_SHORT).show();

//                        ShowCompletionDialog("2","You have Completed All the questions","Do you want to restart again?","Yes","No");

                    }

                    else
                    {
                        Toast.makeText(TrollsActivity.this, "Something went wrong", Toast.LENGTH_SHORT).show();
                    }

                    Log.i("TAG", "post submitted to API." + response.body().toString());
                }

                alertDialog.dismiss();

            }

            @Override
            public void onFailure(Call<DataResponseImages> call, Throwable t) {


                alertDialog.dismiss();

                if (t.toString().contains("timeout"))
                {
                    Toast.makeText(TrollsActivity.this, "Timeout" +
                            "", Toast.LENGTH_SHORT).show();

                    RequestData();
                }


                Log.e("TAG", "Unable to submit post to API.");
            }
        });
    }
}
TrollsAdapter.java
package com.a4akhilsudha.xxx.Adapters;

import android.content.Context;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.a4akhilsudha.xxx.R;
import com.a4akhilsudha.xxx.Retrofit.ImagesDataProvider;
import com.bumptech.glide.Glide;

import java.util.List;

/**
 * Created by a4akhilsudha.
 */

public class TrollsAdapter extends RecyclerView.Adapter<TrollsAdapter.MyViewHolder>{

    Context context;

    List<ImagesDataProvider> imagesDataProviderList;


    public class MyViewHolder extends RecyclerView.ViewHolder {

        public ImageView troll_img;

        public MyViewHolder(View view) {
            super(view);

            troll_img = view.findViewById(R.id.troll_img);

        }

    }

    public TrollsAdapter(Context context, List<ImagesDataProvider> imagesDataProviderList) {

        this.context = context;
        this.imagesDataProviderList = imagesDataProviderList;


    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.troll_item, parent, false);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {

        final ImagesDataProvider imagesDataProvider = imagesDataProviderList.get(position);

//        holder.rdo_grp.clearCheck();

        Glide.with(context).load(imagesDataProvider.getImage()).into(holder.troll_img);
        
    }


    @Override
    public int getItemCount() {
        return imagesDataProviderList.size();
    }


}