panic
panic

Reputation: 2108

readParcelable returns null

I try to pass a News class to an activity, so I implemented the Parcelable interface. Inside News I have two classes implementing Parcelable too, Image and Date

The matter is that my News object at the end contains null for fields image and date.

Here my code:

News.java

public class News implements Parcelable {
public static final String TAG = "model_news";

private JSONObject object;

private int id;
private String type;
private String title;
private Boolean comment_disabled;
private String category_name;
private String url;
private Image images;
private Date date;
private Boolean is_video;

public News(JSONObject object) {
    this.object = object;

    try {
        id = Integer.parseInt(object.getString("id"));
        type = object.getString("type");
        title = object.getString("title");
        comment_disabled = object.getBoolean("comment_disabled");
        category_name = object.getString("category_name");
        url = object.getString("url");

        if (!object.isNull("images")) {
            images = new Image(object.getJSONObject("images"));
        }

        date = new Date(object.getJSONObject("date"));

        is_video = object.getBoolean("is_video");

    } catch (JSONException e) {
        Log.e(TAG, e.getMessage());
    }

}

protected News(Parcel in) {
    id = in.readInt();
    type = in.readString();
    title = in.readString();
    category_name = in.readString();
    url = in.readString();
    images =  (Image) in.readParcelable(Image.class.getClassLoader());
    date = (Date) in.readParcelable(Date.class.getClassLoader());
    is_video = in.readByte() != 0;
    comment_disabled = in.readByte() != 0;
}

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(id);
    dest.writeString(type);
    dest.writeString(title);
    dest.writeByte((byte) (comment_disabled ? 1 : 0));
    dest.writeString(category_name);
    dest.writeString(url);
    dest.writeParcelable(images, flags);
    dest.writeParcelable(date, flags);
    dest.writeByte((byte) (is_video ? 1 : 0));
}

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

}

Image.java

public class Image implements Parcelable {
public static final String TAG = "model_image";

private JSONObject imageObj;
private JSONObject original;

private String source;
private int width;
private Drawable image;

public Image(JSONObject imageObj) {
    this.imageObj = imageObj;

    try {
        original = this.imageObj.getJSONObject("original");
        source = original.getString("src");
        width = original.getInt("width");
    } catch (JSONException e) {
        e.getMessage();
    }
}

protected Image(Parcel in) {
    source = in.readString();
    width = in.readInt();
}

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

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

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(source);
    dest.writeInt(width);
}

}

what I'm doing wrong ?

Upvotes: 1

Views: 1427

Answers (1)

Mohammed Rampurawala
Mohammed Rampurawala

Reputation: 3112

There is mistake in the Parcelable implementation.

First of all parcelable implementation states that: the fields passed in News(Parcel in) Constructor should be written in the same sequence in writeToParcel() method. Thats called Marshalling and Unmarshalling.

Corrections:

  1. Drawable cannot be passed a parameter in Parcelable.

  2. News Parcelable implementation.

Missed some of the fields its just for your understanding.

public class News implements Parcelable {

public static final String TAG = "model_news";

    private JSONObject object;

    private int id;
    private String type;
    private String title;
    private Boolean comment_disabled;
    private String category_name;
    private String url;
    private Image images;
    private Date date;
    private Boolean is_video;

    protected News(Parcel in) {
        id = in.readInt();
        type = in.readString();
        title = in.readString();
        category_name = in.readString();
        url = 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];
        }
    };

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(id);
        dest.writeString(type);
        dest.writeString(title);
        dest.writeString(category_name);
        dest.writeString(url);
    }
}






public class Image implements Parcelable {
    public static final String TAG = "model_image";

private JSONObject imageObj;
private JSONObject original;

private String source;
private int width;
private Drawable image;

protected Image(Parcel in) {
    source = in.readString();
    width = in.readInt();
}

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

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

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(source);
    dest.writeInt(width);
}
}

Upvotes: 3

Related Questions