Исключение нулевого указателя в ответе с использованием модернизации - PullRequest
1 голос
/ 10 ноября 2019

Я снова пытаюсь использовать API TMBD. Я использую окно повторного просмотра, чтобы отобразить данные в список. Но ответ, полученный от модифицированного ответа, равен нулю.

Основная активность:

public class MainActivity extends AppCompatActivity {

    public final static String BASE_URL="https://api.themoviedb.org";
    public final static String apiKey="<ApiKey>";
    public final static String language="en-US";
    public final static String TAG="tag";

    @BindView(R.id.recyclerView)
    RecyclerView movieList;

    DisplayAdapter adapter;
    MovieResponse result;

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

        ButterKnife.bind(this);

        Retrofit retrofit=new Retrofit.Builder()
                                .baseUrl(BASE_URL)
                                .addConverterFactory(GsonConverterFactory.create())
                                .build();

        ApiInterface apiInterface=retrofit.create(ApiInterface.class);

        apiInterface.getMovies(apiKey,language,1)
                .enqueue(new Callback<MovieResponse>() {
                    @Override
                    public void onResponse(Call<MovieResponse> call, Response<MovieResponse> response) {
                        if(response.isSuccessful())
                        {
                            result=response.body();
                            Log.e(TAG, "onCreate: "+result );
                        }
                    }

                    @Override
                    public void onFailure(Call<MovieResponse> call, Throwable t) { }
                });

        Log.e(TAG, "onCreate: "+result );
        adapter=new DisplayAdapter(getApplicationContext(),result);
        RecyclerView.LayoutManager layoutManager=new GridLayoutManager(getApplicationContext(),1);
        movieList.setLayoutManager(layoutManager);
        movieList.setAdapter(adapter);
    }
}

Класс ответа:

public class MovieResponse {

    private int page;
    private int total_results;
    private int total_pages;
    private List<ResultsBean> results;

    public int getPage() {
        return page;
    }

    public void setPage(int page) {
        this.page = page;
    }

    public int getTotal_results() {
        return total_results;
    }

    public void setTotal_results(int total_results) {
        this.total_results = total_results;
    }

    public int getTotal_pages() {
        return total_pages;
    }

    public void setTotal_pages(int total_pages) {
        this.total_pages = total_pages;
    }

    public List<ResultsBean> getResults() {
        return results;
    }

    public void setResults(List<ResultsBean> results) {
        this.results = results;
    }

    public static class ResultsBean {

        private double popularity;
        private int vote_count;
        private boolean video;
        private String poster_path;
        private int id;
        private boolean adult;
        private String backdrop_path;
        private String original_language;
        private String original_title;
        private String title;
        private double vote_average;
        private String overview;
        private String release_date;
        private List<Integer> genre_ids;

        public double getPopularity() {
            return popularity;
        }

        public void setPopularity(double popularity) {
            this.popularity = popularity;
        }

        public int getVote_count() {
            return vote_count;
        }

        public void setVote_count(int vote_count) {
            this.vote_count = vote_count;
        }

        public boolean isVideo() {
            return video;
        }

        public void setVideo(boolean video) {
            this.video = video;
        }

        public String getPoster_path() {
            return poster_path;
        }

        public void setPoster_path(String poster_path) {
            this.poster_path = poster_path;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public boolean isAdult() {
            return adult;
        }

        public void setAdult(boolean adult) {
            this.adult = adult;
        }

        public String getBackdrop_path() {
            return backdrop_path;
        }

        public void setBackdrop_path(String backdrop_path) {
            this.backdrop_path = backdrop_path;
        }

        public String getOriginal_language() {
            return original_language;
        }

        public void setOriginal_language(String original_language) {
            this.original_language = original_language;
        }

        public String getOriginal_title() {
            return original_title;
        }

        public void setOriginal_title(String original_title) {
            this.original_title = original_title;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public double getVote_average() {
            return vote_average;
        }

        public void setVote_average(double vote_average) {
            this.vote_average = vote_average;
        }

        public String getOverview() {
            return overview;
        }

        public void setOverview(String overview) {
            this.overview = overview;
        }

        public String getRelease_date() {
            return release_date;
        }

        public void setRelease_date(String release_date) {
            this.release_date = release_date;
        }

        public List<Integer> getGenre_ids() {
            return genre_ids;
        }

        public void setGenre_ids(List<Integer> genre_ids) {
            this.genre_ids = genre_ids;
        }
    }
}

Интерфейс API:

public interface ApiInterface {

    @GET("3/movie/popular")
    Call<MovieResponse> getMovies(
            @Query("api_key") String apiKey,
            @Query("language")String language,
            @Query("page")int page
    );
}

Я изучаю концепцию вызова API. Я не понимаю, почему ответ нулевой. Если кто-нибудь сможет объяснить причину, это будет очень полезно.

1 Ответ

0 голосов
/ 14 ноября 2019

Это может быть несколько вещей из того, что вы опубликовали.

Может случиться так, что модели Java не соответствуют JSON. Вам придется перепроверить это.

Может случиться так, что вы получите ошибку, в этом случае модификация не имеет response.body(), а скорее response.errorBody(). Вы можете проверить это путем отладки и проверки response.erroeBody().string().

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

adapter=new DisplayAdapter(getApplicationContext(),result);

В этом случае выиспользуя result, но он назначается внутри обратного вызова дооснащения, который, скорее всего, завершился после создания адаптера, и, следовательно, result по-прежнему равен нулю.

Вы можете переместить создание адаптера и установить его в спискевнутри обратного вызова:

public void onResponse(Call<MovieResponse> call, Response<MovieResponse> response) {
                    if(response.isSuccessful())
                    {
                        result=response.body();
                        Log.e(TAG, "onCreate: "+result );

                       adapter=new DisplayAdapter(getApplicationContext(),result);
                       RecyclerView.LayoutManager layoutManager=new GridLayoutManager(getApplicationContext(),1);
                       movieList.setLayoutManager(layoutManager);
                       movieList.setAdapter(adapter);
                    }
                }

Это единственное, что приходит на ум. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...