How to create multiple Retrofit callbacks in the same fragment - android

I am trying to implement several buttons in a fragment, and each of these buttons should get some data from the web api.

I created a retroactive callback for one button. Now I have some problems creating another button to get data from another api.

here is my interface:

public interface APIService { @GET("/api/partners.json") Call<List<Partner>> getPartners(); @GET("/api/drivers.json") Call<List<Driver>> getDrivers(); @GET("/api/warehouses.json") Call<List<Warehouse>> getWarehuses(); } 

This is my helper api class:

 public class APIHelper { public static final String BASE_URL = "https://part-of-url.herokuapp.com/"; public static APIService apiService; public static APIService getApiService() { if (apiService == null) { Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()).build(); apiService = retrofit.create(APIService.class); } return apiService; } } 

this is my pojo driver model (all pojo models are almost the same)

 public class Driver { @Expose private List<String> driver_name = new ArrayList<String>(); public List<String> getDriver_name() { return driver_name; } public void setDriver_name(List<String> driver_name) { this.driver_name = driver_name; } } 

And this is my fragment where I have a callback for partners, and you need to implement one more button to get drivers and a third button to get some repositories.

 public class DownloadMain extends Fragment implements Callback<Partner> { private static final String TAG = DownloadMain.class.getSimpleName(); private Button dloadPartners, takeDrivers, takeWarehouses, takeUsers, takeLogs; private Call callPartners; public DownloadMain() {} public DownloadMain newInstance() { return new DownloadMain(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.download_main, container, false); dloadPartners = (Button) view.findViewById(R.id.downloadPartners); takeDrivers = (Button) view.findViewById(R.id.btnDrivers); dloadPartners.setOnClickListener(btnListener); takeDrivers.setOnClickListener(btnDrivers); callPartners = APIHelper.getApiService().getPartners(); return view; } Button.OnClickListener btnListener = (new Button.OnClickListener() { @Override public void onClick(View v) { callPartners.clone().enqueue(DownloadMain.this); checkIfDataIsInTable(); } }); @Override public void onResponse(Call call, Response response) { if(response.body() == null) { try { response.errorBody().string(); } catch (IOException e) { e.printStackTrace(); } Toast.makeText(getActivity(), "No Partners!", Toast.LENGTH_SHORT).show(); } else { ArrayList<String> partners = (ArrayList<String>) response.body(); ActiveAndroid.beginTransaction(); try { for (int i = 0; i < partners.size() ; i++) { Partners partner = new Partners(); partner.name = String.valueOf(partners); partner.save(); Log.d("partner_ ", String.valueOf(response.body())); } ActiveAndroid.setTransactionSuccessful(); } finally { ActiveAndroid.endTransaction(); } Log.d(TAG, "Number of partners received: " + partners.size()); Toast.makeText(getActivity(), "Partners downloaded!", Toast.LENGTH_SHORT).show(); } } @Override public void onFailure(Call call, Throwable t) { } } 

Now it’s hard for me to implement a second button to get data from the api.

I would be grateful if anyone could help me execute the second button to get drivers from api ?!

+6
source share
2 answers

With the retrofit2 function, you can do onResponse and onFailure inline with call.enqueue, which allows you to have several types of calls in the same activity, as they are encapsulated in call.enqueue ()

 // the following can be in the same activity Call<YourPOJO1> call1 = client.callName1(params); call1.enqueue(new Callback<YourPOJO1>() { @Override public void onResponse(Call<YourPOJO1> call, Response<YourPOJO1> response) { Log.d(TAG, "Call1 Succeeded"); int code = response.code(); if (code == 200) { // your parsing of POJO1 here } else { Log.d(TAG, "Error Happened"); } } @Override public void onFailure(Call<YourPOJO1> call, Throwable t) { Log.d(TAG, "Call1 Failed"); } }); Call<YourPOJO2> call2 = client.callName2(params); call2.enqueue(new Callback<YourPOJO2>() { @Override public void onResponse(Call<YourPOJO2> call, Response<YourPOJO2> response) { Log.d(TAG, "Call2 Succeeded"); int code = response.code(); if (code == 200) { // your parsing of POJO2 here } else { Log.d(TAG, "Error Happened"); } } @Override public void onFailure(Call<YourPOJO2> call, Throwable t) { Log.d(TAG, "Call2 Failed"); } }); 
+4
source

You may be able to do this using the base model, for example:

 @GET("mypath") Call<MyBaseModel<List<MyModel>>> getData(); 

implement a callback in a fragment like

 Callback<MyBaseModel<List<?>>> 

An example of a MyBaseModel model would be:

 public class MyBaseModel<Data> { private String page; private Data[] results; public String getPage() { return page; } public Data[] getResults() { return results; } } 

OnResponse should return:

  Callback<MyBaseModel<?>> 

then just check if the result is an instance of your model using 'instanceOf'

+2
source

All Articles