android - 使用 pojo 的 Retrofit + RxJava 错误中的空指针
问题描述
我知道伙计们。空指针已经很多了。老实说,我阅读了所有这些主题,但在代码中找不到错误。请帮忙。
我使用常规方案 RxJava + 改造,但得到的空指针日志表明该错误作为响应。可能是模型的问题,但我检查了它。我知道我丢失了一些东西,但不知道到底是什么。
分段
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
/**
* Main Initialization
*/
resultsList = new ArrayList<>();
//adapter = new ListAdapter(resultsList);
view = inflater.inflate(R.layout.fragment_list, container, false);
recyclerView = (RecyclerView) view.findViewById(R.id.recycler_list_detailed);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
//adapter.setClickListener(this);
/**
* Checking for internet connection
*/
if (InternetConnection.checkConnection(getContext())) {
final ProgressDialog dialog;
dialog = new ProgressDialog(getContext());
dialog.setTitle(getString(R.string.string_getting_json_title));
dialog.setMessage(getString(R.string.string_getting_json_message));
dialog.show();
/**
* Making HTTP request
*/
ApiService api = RetrofitClient.getApiService();
Observable.just(api.getPhotosList(getString(R.string.api_key)))
.map(Call::execute)
.filter(Response::isSuccessful)
.map(Response::body)
.onErrorReturn(throwable -> new ResultsPojo(new ArrayList<>(), 1))
.doOnError(throwable -> Log.e("ERROR", throwable.getMessage()))
.map(ResultsPojo::getMovies)
.doOnNext(list -> {
if (!list.isEmpty()) {
adapter = new ListAdapter(list);
recyclerView.setAdapter(adapter);
} else Log.d("LISTMOVIES", "Something went wrong!!!");
}).subscribe();
ApiService
public interface ApiService {
@GET("3/movie/popular")
Call<ResultsPojo> getPhotosList(@Query("api_key") String key);
}
电影Pojo
public class MoviesPojo {
@SerializedName("vote_count")
@Expose
private int voteCount;
@SerializedName("id")
@Expose
private int id;
@SerializedName("video")
@Expose
private boolean video;
@SerializedName("vote_average")
@Expose
private double voteAverage;
@SerializedName("title")
@Expose
private String title;
@SerializedName("popularity")
@Expose
private double popularity;
@SerializedName("poster_path")
@Expose
private String posterPath;
@SerializedName("original_language")
@Expose
private String originalLanguage;
@SerializedName("original_title")
@Expose
private String originalTitle;
@SerializedName("genre_ids")
@Expose
private List<Integer> genreIds = null;
@SerializedName("backdrop_path")
@Expose
private String backdropPath;
@SerializedName("adult")
@Expose
private boolean adult;
@SerializedName("overview")
@Expose
private String overview;
@SerializedName("release_date")
@Expose
private String releaseDate;
public int getVoteCount() {
return voteCount;
}
public void setVoteCount(int voteCount) {
this.voteCount = voteCount;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public boolean isVideo() {
return video;
}
public void setVideo(boolean video) {
this.video = video;
}
public double getVoteAverage() {
return voteAverage;
}
public void setVoteAverage(double voteAverage) {
this.voteAverage = voteAverage;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public double getPopularity() {
return popularity;
}
public void setPopularity(double popularity) {
this.popularity = popularity;
}
public String getPosterPath() {
return posterPath;
}
public void setPosterPath(String posterPath) {
this.posterPath = posterPath;
}
public String getOriginalLanguage() {
return originalLanguage;
}
public void setOriginalLanguage(String originalLanguage) {
this.originalLanguage = originalLanguage;
}
public String getOriginalTitle() {
return originalTitle;
}
public void setOriginalTitle(String originalTitle) {
this.originalTitle = originalTitle;
}
public List<Integer> getGenreIds() {
return genreIds;
}
public void setGenreIds(List<Integer> genreIds) {
this.genreIds = genreIds;
}
public String getBackdropPath() {
return backdropPath;
}
public void setBackdropPath(String backdropPath) {
this.backdropPath = backdropPath;
}
public boolean isAdult() {
return adult;
}
public void setAdult(boolean adult) {
this.adult = adult;
}
public String getOverview() {
return overview;
}
public void setOverview(String overview) {
this.overview = overview;
}
public String getReleaseDate() {
return releaseDate;
}
public void setReleaseDate(String releaseDate) {
this.releaseDate = releaseDate;
}
}
结果Pojo
public class ResultsPojo {
@SerializedName("page")
@Expose
private int page;
@SerializedName("total_results")
@Expose
private int totalResults;
@SerializedName("total_pages")
@Expose
private int totalPages;
@SerializedName("moviesPojos")
@Expose
private List<MoviesPojo> moviesPojos;
public ResultsPojo(List<MoviesPojo> results, int page){
this.moviesPojos = results;
this.page = page;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getTotalResults() {
return totalResults;
}
public void setTotalResults(int totalResults) {
this.totalResults = totalResults;
}
public int getTotalPages() {
return totalPages;
}
public void setTotalPages(int totalPages) {
this.totalPages = totalPages;
}
public List<MoviesPojo> getMovies() {
return moviesPojos;
}
public void setMoviesPojos(List<MoviesPojo> moviesPojos) {
this.moviesPojos = moviesPojos;
}
}
适配器
private List<MoviesPojo> resultList;
private ItemClickListener mClickListener;
public ListAdapter(List<MoviesPojo> data) {
this.resultList = data;
}
@NonNull
@Override
public ListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_banner, parent, false);
return new ListViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ListViewHolder holder, int position) {
}
@Override
public int getItemCount() {
//TODO Здесь мы должны получить список ссылок для изображений
return resultList.size();
}
public class ListViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
ImageView mImageBanner;
public ListViewHolder(View itemView) {
super(itemView);
mImageBanner = (ImageView) itemView.findViewById(R.id.item_banner_image);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
}
}
// convenience method for getting data at click position
// public String getItem(int id) {
// return resultList.get(id);
// }
public void setClickListener(ItemClickListener itemClickListener) {
this.mClickListener = itemClickListener;
}
public interface ItemClickListener {
void onItemClick(View view, int position);
}
错误
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.borisruzanov.popularmovies, PID: 10947
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.borisruzanov.popularmovies/com.borisruzanov.popularmovies.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.borisruzanov.popularmovies.adapters.ListAdapter.setClickListener(com.borisruzanov.popularmovies.adapters.ListAdapter$ItemClickListener)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.borisruzanov.popularmovies.adapters.ListAdapter.setClickListener(com.borisruzanov.popularmovies.adapters.ListAdapter$ItemClickListener)' on a null object reference
at com.borisruzanov.popularmovies.ListFragment.onCreateView(ListFragment.java:51)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2346)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1428)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1759)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1827)
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2596)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2383)
at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2338)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2245)
at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3248)
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3200)
at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:195)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:597)
at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:177)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1248)
at android.app.Activity.performStart(Activity.java:6679)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2609
非常感谢您的宝贵时间!!!+1 业力
解决方案
推荐阅读
- ios - SwiftUI:核心数据的 @FetchRequest 不起作用
- netlogo - 在 NetLogo 中,如何获取乌龟相邻块的坐标和变量值?
- css - Sass @extend 在构建期间考虑导入的 css
- php - symfony 4中多对多关系的表单渲染不起作用
- android - Kotlin 过滤器在 RecyclerView 中搜索 EditText
- android - 在android中保存大量文本的最佳方法
- javascript - 如何从父组件访问嵌套组件?
- ruby - 如何重构 IEX 交换数据调用以从 ruby 程序中的 api 获取数据
- google-cloud-platform - GCP Dataflow- 从 Compute Engine 虚拟机读取 CSV 文件并写入 BigQuery
- python - 从其他几个函数中调用一个函数?