使用改造的响应中的空指针异常

我再次尝试使用TMBD api。我正在使用recyclerview将数据映射到列表中。但是我从翻新响应中得到的响应为空。

主要活动:

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调用的概念。我不明白为什么响应为空。如果有人能解释其原因,那将非常有帮助。

ty220180 回答:使用改造的响应中的空指针异常

这可能与您发布的内容有关。

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

这些是我唯一想到的。希望对您有所帮助。


编辑

看完github项目后,我发现崩溃的唯一原因是在DisplayAdapter.java第44行中:

holder.movieRating.setText((int) listOfMovies.getResults().get(position).getVote_average());

当您调用接受setText的{​​{1}}时,实际上是在调用一种方法,该方法将在int中查找ID等于strings.xml的字符串您已通过。在这种情况下,您正在将平均投票作为int通过。我猜想您想要的是显示投票平均值,因此解决方案是将int投票平均值转换为字符串。使用double可以轻松实现:

String.valueOf

也许最有趣的位在日志消息holder.movieRating.setText(String.valueOf(listOfMovies.getResults().get(position).getVote_average())); 中。试图查找不存在的字符串时将抛出此错误。

本文链接:https://www.f2er.com/3130309.html

大家都在问