@hax
junior developer

Как передать объект (Parcelable) между Activity?

Имеется у меня меня объект NewsRequest, который требуется передать во второе Activity. Вот его объявление:
public class NewsRequest implements Parcelable {

    private boolean success;

    private List<News> newsList;

    protected NewsRequest(Parcel in) {
        success = in.readByte() != 0;
        in.readList(newsList, News.class.getClassLoader());
    }

    public static final Creator<NewsRequest> CREATOR = new Creator<NewsRequest>() {
        @Override
        public NewsRequest createFromParcel(Parcel in) {
            return new NewsRequest(in);
        }

        @Override
        public NewsRequest[] newArray(int size) {
            return new NewsRequest[size];
        }
    };

    public List<News> getNewsList() {
        return newsList;
    }

    public boolean isSuccess() {
        return success;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeByte((byte) (success ? 1 : 0));
        parcel.writeTypedList(newsList);
    }
}


News:
public class News implements Parcelable {

    private long date;

    private String sourceLogo;

    private String title;

    private String url;

    private String source;

    protected News(Parcel in) {
        date = in.readLong();
        sourceLogo = in.readString();
        title = in.readString();
        url = in.readString();
        source = in.readString();
    }

    public static final Creator<News> CREATOR = new Creator<News>() {
        @Override
        public News createFromParcel(Parcel in) {
            return new News(in);
        }

        @Override
        public News[] newArray(int size) {
            return new News[size];
        }
    };

    public long getDate() {
        return date;
    }

    public String getSourceLogo() {
        return sourceLogo;
    }

    public String getTitle() {
        return title;
    }

    public String getUrl() {
        return url;
    }

    public String getSource() {
        return source;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeLong(date);
        parcel.writeString(sourceLogo);
        parcel.writeString(title);
        parcel.writeString(url);
        parcel.writeString(source);
    }
}


Вот так я передаю объект:
Intent intent = new Intent(StartActivity.this, NewsActivity.class);
        intent.putExtra(NewsRequest.class.getCanonicalName(), news);
        startActivity(intent);


А вот так я его принимаю:
NewsRequest getNews = (NewsRequest) getIntent().getParcelableExtra(
                NewsRequest.class.getCanonicalName());


Программа валится на строчке (NullPointerException): in.readList(newsList, News.class.getClassLoader()); (NewsRequest.java)
Пробовал также in.readList(newsList, null) - такая же ошибка
  • Вопрос задан
  • 385 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
21 век на дворе, я уже начал забывать, как реализовывать парселабл. Используй AutoValue.
По NPE - в джаве нет настоящих out-параметров. Ты передаёшь в метод список и в методе он заполняется. Ты передаёшь null и происходит NPE. Инициализируй список.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы