Я относительно новичок в android и в настоящее время работаю над приложением для извлечения данных mov ie из tmdb api. В моем приложении есть 4 разных фрагмента, соответствующих различным критериям поиска, передаваемым в API, например обнаружение, тенденции, данные о людях и ТВ. Я использую модификацию для выполнения вызовов, и я определил для этого интерфейс ниже:
final String BASE_URL = "https://api.themoviedb.org/3/";
@GET("discover/movie")
Call<DISCOVERPOJO> getDiscover(@Query("sort_by") String sort_by, @Query("api_key") String api_key);
@GET("trending/{media_type}/{time_window}")
Call<TRENDINGPOJO> getTrending(@Path("media_type") String media_type, @Path("time_window") String time_window, @Query("api_key") String api_key);
@GET("person/popular")
Call<DISCOVERPOJO> getPeople(@Query("api_key") String api_key);
@GET("tv/top_rated")
Observable<DISCOVERPOJO> getTopRatedTv(@Query("api_key") String api_key);
@GET("tv/popular")
Observable<DISCOVERPOJO> getPopularTv(@Query("api_key") String api_key);
@GET("tv/on_the_air")
Observable<DISCOVERPOJO> getOnAirTv(@Query("api_key") String api_key);
@GET("tv/airing_today")
Observable<DISCOVERPOJO> getAiringTodayTv(@Query("api_key") String api_key);
На трех из моих фрагментов я обнаружил, что повторяю относительно похожий код, мой вопрос заключается в том, как определить класс с методом, который выполняет синтаксический анализ, на который я могу ссылаться из фрагментов, а не повторять код,
ниже приведены три метода, которые я заинтересован в рефакторинге, каждый из которых соответствует фрагменту, который я использую для выполнения вызова , получить и проанализировать данные из api, которые я затем передаю в массив списков типа MOVIES, который является моим классом POJO,
для моего 'Discoverfragment'
private void getDiscoverResponse() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(TMDBAPICLIENT.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
TMDBAPICLIENT tmdbApi = retrofit.create(TMDBAPICLIENT.class);
Call<DISCOVERPOJO> call = tmdbApi.getDiscover(sort_by,API_KEY);
call.enqueue(new Callback<DISCOVERPOJO>() {
@Override
public void onResponse(Call<DISCOVERPOJO> call, Response<DISCOVERPOJO> response) {
DISCOVERPOJO movies = response.body();
JsonArray allmovies;
allmovies = movies.getResults();
if(allmovies!= null){
for(int i = 0; i < allmovies.size(); i++){
Gson gson = new Gson();
Type listType = new TypeToken<Collection<MOVIES>>(){}.getType();
moviez = gson.fromJson(allmovies, listType);
}
movieAdapter.setData(moviez);
progressBar.setVisibility(View.INVISIBLE);
}
}
@Override
public void onFailure(Call<DISCOVERPOJO> call, Throwable t) {
// Toast.makeText(rootView.getContext(), t.getMessage(), Toast.LENGTH_LONG).show();
}
});
}
для моего 'TrendingFragment '
private void getTrendingResponse(){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(TMDBAPICLIENT.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
TMDBAPICLIENT tmdbApi = retrofit.create(TMDBAPICLIENT.class);
Call<TRENDINGPOJO> call = tmdbApi.getTrending("tv","week",API_KEY);
call.enqueue(new Callback<TRENDINGPOJO>() {
@Override
public void onResponse(Call<TRENDINGPOJO> call, Response<TRENDINGPOJO> response) {
TRENDINGPOJO movies = response.body();
JsonArray allmovies;
allmovies = movies.getResults();
if(allmovies!= null){
for(int i = 0; i < allmovies.size(); i++){
Gson gson = new Gson();
Type listType = new TypeToken<Collection<MOVIES>>(){}.getType();
moviez = gson.fromJson(allmovies, listType);
}
movieAdapter.setData(moviez);
progressBar.setVisibility(View.INVISIBLE);
}
}
@Override
public void onFailure(Call<TRENDINGPOJO> call, Throwable t) {
//Toast.makeText(rootView.getContext(), t.getMessage(), Toast.LENGTH_LONG).show();
if (t.getMessage() != null) {
Log.d("response error", t.getMessage());
}
}
});
}
и, наконец, для моего' PeopleFragment '
public void getPeopleResponse(){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(TMDBAPICLIENT.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
TMDBAPICLIENT tmdbApi = retrofit.create(TMDBAPICLIENT.class);
Call<DISCOVERPOJO> call = tmdbApi.getPeople(TMDB_API_KEY);
call.enqueue(new Callback<DISCOVERPOJO>() {
@Override
public void onResponse(@NonNull Call<DISCOVERPOJO> call, @NonNull Response<DISCOVERPOJO> response) {
DISCOVERPOJO people = response.body();
JsonArray allpeople;
if ( response.body() != null) {
allpeople = people.getResults();
if (allpeople != null) {
for (int i = 0; i < allpeople.size(); i++) {
Gson gson = new Gson();
Type listType = new TypeToken<Collection<PEOPLE>>() {
}.getType();
peoplez = gson.fromJson(allpeople, listType);
}
peopleAdapter.setData(peoplez);
progressBar.setVisibility(View.INVISIBLE);
}
}
else {
Toast.makeText(getContext(), "error api returned no response", Toast.LENGTH_LONG).show();
int code = response.code();
Log.d("status code", String.valueOf(code));
String message = response.message();
Log.d("error message", message);
}
}
@Override
public void onFailure(Call<DISCOVERPOJO> call, Throwable t) {
//Toast.makeText(rootView.getContext(), t.getMessage(), Toast.LENGTH_LONG).show();
if (t.getMessage() != null) {
Log.d("response error", t.getMessage());
}
}
});
}