Как эффективно анализировать json данных для нескольких фрагментов в android - PullRequest
0 голосов
/ 13 июля 2020

Я относительно новичок в 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());
            }
        }
    });
}
...