为日期对象实现 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)

完整源代码: https://github.com/troy21688/PopularMovies

在您项目的链接源代码中,这些是可打包的 "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 codeMovie(Parcel in) 构造函数似乎从未初始化过 this.release_date,因此当您尝试访问它时它为 null。

我使用 "TheMovieDatabase API" 作为项目创建了一个名为 Cinemate 的类似应用程序,它是优达学城 Android 纳米学位项目的一部分。

在我看来,您可能遇到了类型问题。尝试从端点检索日期作为 String 并相应地修改您的 Movie class。