2016-09-07 3 views
6

Я пытаюсь реализовать в фрагменте несколько кнопок, и каждая из этих кнопок должна получить некоторые данные из веб-api.Как создать множественные обратные вызовы в том же фрагменте - андроид

Я создал ретро-обратный вызов для одной кнопки. Теперь у меня есть некоторые проблемы с созданием другой кнопки для получения данных из другого api.

вот мой интерфейс:

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(); 
} 

Это мой апи вспомогательный класс:

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; 
    } 
} 

это мой водитель модель POJO (все модели POJO почти то же самое)

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; } 
} 

И это мой фрагмент, где у меня есть обратный вызов для партнеров, и вам нужно реализовать еще одну кнопку, чтобы получить драйверы и для получения некоторых хранилищ.

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) { 

    } 
} 

Теперь у меня есть проблема с внедрением второй кнопки для получения данных из api.

Я был бы признателен, если кто-то может помочь мне выполнить вторую кнопку, чтобы получить драйверы от api ?!

ответ

4

С retrofit2 вы можете сделать onResponse и OnFailure инлайн с call.enqueue, который позволяет иметь несколько типов вызовов в та же деятельность, поскольку они заключены в 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"); 
     } 
    }); 
2

Вы могли бы быть в состоянии сделать это с помощью базовой модели, такие как:

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

реализации Обратного в фрагменте, как

Callback<MyBaseModel<List<?>>> 

Примером MyBaseModel будет:

public class MyBaseModel<Data> { 
    private String page; 
    private Data[] results; 

    public String getPage() { 
    return page; 
    } 

    public Data[] getResults() { 
    return results; 
    } 
} 

The onResponse должен вернуть:

Callback<MyBaseModel<?>> 

затем просто проверить, если результат является экземпляром модели с использованием «InstanceOf»

Смежные вопросы