为日期对象实现 Parcelable - NullPointerException
Implementing Parcelable for Date Object - NullPointerException
我正在尝试从 TheMovieDatabase API 中提取发布日期值。其中一项 returns 是 Date
值。
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeInt(vote_count);
parcel.writeInt(id);
parcel.writeByte((byte) (video ? 1:0));
parcel.writeString(title);
parcel.writeFloat(popularity);
parcel.writeString(poster_path);
parcel.writeString(original_language);
parcel.writeString(original_title);
parcel.writeStringList(genre_ids);
parcel.writeString(backdrop_path);
parcel.writeByte((byte) (adult ? 1:0));
parcel.writeString(overview);
parcel.writeLong(release_date.getTime());
}
IndividualMovieActivity.java:
public class IndividualMovieActivity extends AppCompatActivity {
private TextView mMovieTitle;
private ImageView mMoviePoster;
private TextView mMovieReleaseDate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_individual_movie);
Intent intent = getIntent();
Movie movie = intent.getParcelableExtra("Movie");
String title = movie.getOriginal_title();
Log.v("POSTER_PATH", movie.getPoster_path());
Log.v("RELEASE", movie.getRelease_date().toString());
mMovieTitle = findViewById(R.id.movie_name);
mMoviePoster = findViewById(R.id.movie_details_movie_poster_image);
mMovieReleaseDate = findViewById(R.id.movie_details_release_date);
mMovieTitle.setText(title);
Picasso.with(getApplicationContext())
.load("http://image.tmdb.org/t/p/w185" + movie.getPoster_path())
.into(mMoviePoster);
mMovieReleaseDate.setText((CharSequence) movie.getRelease_date());
}
}
Caused by: java.lang.NullPointerException: Attempt to invoke virtual
method 'java.lang.String java.util.Date.toString()' on a null object
reference
at popularmovies.troychuinard.com.popularmovies.IndividualMovieActivity.onCreate(IndividualMovieActivity.java:29)
在您项目的链接源代码中,这些是可打包的 "read" 和 "write" 方法:
protected Movie(Parcel in) {
vote_count = in.readInt();
id = in.readInt();
video = in.readByte() != 0;
title = in.readString();
popularity = in.readFloat();
poster_path = in.readString();
original_language = in.readString();
original_title = in.readString();
genre_ids = in.createStringArrayList();
backdrop_path = in.readString();
adult = in.readByte() != 0;
overview = in.readString();
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeInt(vote_count);
parcel.writeInt(id);
parcel.writeByte((byte) (video ? 1:0));
parcel.writeString(title);
parcel.writeFloat(popularity);
parcel.writeString(poster_path);
parcel.writeString(original_language);
parcel.writeString(original_title);
parcel.writeStringList(genre_ids);
parcel.writeString(backdrop_path);
parcel.writeByte((byte) (adult ? 1:0));
parcel.writeString(overview);
parcel.writeLong(release_date.getTime());
}
如果仔细观察,您会发现 Parcel 构造函数没有 release_date
的 "read" 操作。您可能需要添加如下内容:
release_date = new Date(in.readLong());
查看 source code,Movie(Parcel in)
构造函数似乎从未初始化过 this.release_date
,因此当您尝试访问它时它为 null。
我使用 "TheMovieDatabase API" 作为项目创建了一个名为 Cinemate 的类似应用程序,它是优达学城 Android 纳米学位项目的一部分。
在我看来,您可能遇到了类型问题。尝试从端点检索日期作为 String
并相应地修改您的 Movie
class。
我正在尝试从 TheMovieDatabase API 中提取发布日期值。其中一项 returns 是 Date
值。
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeInt(vote_count);
parcel.writeInt(id);
parcel.writeByte((byte) (video ? 1:0));
parcel.writeString(title);
parcel.writeFloat(popularity);
parcel.writeString(poster_path);
parcel.writeString(original_language);
parcel.writeString(original_title);
parcel.writeStringList(genre_ids);
parcel.writeString(backdrop_path);
parcel.writeByte((byte) (adult ? 1:0));
parcel.writeString(overview);
parcel.writeLong(release_date.getTime());
}
IndividualMovieActivity.java:
public class IndividualMovieActivity extends AppCompatActivity {
private TextView mMovieTitle;
private ImageView mMoviePoster;
private TextView mMovieReleaseDate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_individual_movie);
Intent intent = getIntent();
Movie movie = intent.getParcelableExtra("Movie");
String title = movie.getOriginal_title();
Log.v("POSTER_PATH", movie.getPoster_path());
Log.v("RELEASE", movie.getRelease_date().toString());
mMovieTitle = findViewById(R.id.movie_name);
mMoviePoster = findViewById(R.id.movie_details_movie_poster_image);
mMovieReleaseDate = findViewById(R.id.movie_details_release_date);
mMovieTitle.setText(title);
Picasso.with(getApplicationContext())
.load("http://image.tmdb.org/t/p/w185" + movie.getPoster_path())
.into(mMoviePoster);
mMovieReleaseDate.setText((CharSequence) movie.getRelease_date());
}
}
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.util.Date.toString()' on a null object reference at popularmovies.troychuinard.com.popularmovies.IndividualMovieActivity.onCreate(IndividualMovieActivity.java:29)
在您项目的链接源代码中,这些是可打包的 "read" 和 "write" 方法:
protected Movie(Parcel in) { vote_count = in.readInt(); id = in.readInt(); video = in.readByte() != 0; title = in.readString(); popularity = in.readFloat(); poster_path = in.readString(); original_language = in.readString(); original_title = in.readString(); genre_ids = in.createStringArrayList(); backdrop_path = in.readString(); adult = in.readByte() != 0; overview = in.readString(); } @Override public void writeToParcel(Parcel parcel, int i) { parcel.writeInt(vote_count); parcel.writeInt(id); parcel.writeByte((byte) (video ? 1:0)); parcel.writeString(title); parcel.writeFloat(popularity); parcel.writeString(poster_path); parcel.writeString(original_language); parcel.writeString(original_title); parcel.writeStringList(genre_ids); parcel.writeString(backdrop_path); parcel.writeByte((byte) (adult ? 1:0)); parcel.writeString(overview); parcel.writeLong(release_date.getTime()); }
如果仔细观察,您会发现 Parcel 构造函数没有 release_date
的 "read" 操作。您可能需要添加如下内容:
release_date = new Date(in.readLong());
查看 source code,Movie(Parcel in)
构造函数似乎从未初始化过 this.release_date
,因此当您尝试访问它时它为 null。
我使用 "TheMovieDatabase API" 作为项目创建了一个名为 Cinemate 的类似应用程序,它是优达学城 Android 纳米学位项目的一部分。
在我看来,您可能遇到了类型问题。尝试从端点检索日期作为 String
并相应地修改您的 Movie
class。