intent getextra中嵌套的Parcelable的空指针异常

问题描述 投票:1回答:1

我有一个嵌套的可拆分类(产品类内部具有Provider类)。我想将Product对象发送到另一个活动中,并且具有额外的意图。当我有意图时,提供者对象为null。

Outer(Parent)类是Product(为方便起见,省略了setter和getter的方法):

public class Product implements Parcelable {

    public static final String KEY_CART_COUNT = "KEY_CART_COUNT";
    private int id;
    private String title;
    private String description;
    @SerializedName("category_id")
    private int categoryId;
    @SerializedName("city_id")
    private int cityId;
    private String fee;
    private String fee2;
    @SerializedName("main_cat")
    private Integer mainCategory;
    @SerializedName("barcode_type")
    private String barcodeType;
    @SerializedName("barcode_text")
    private String barcodeText;
    private String unit;
    private String image;
    @SerializedName("is_active")
    private int isActive;
    @SerializedName("now")
    private long now;

    //*****************************************************************
    @SerializedName("provider_info")
    private Provider provider;
    //*****************************************************************


    @SerializedName("is_bookmarked")
    private boolean isBookmarked;
    @SerializedName("image_url")
    private String imageUrl;
    @SerializedName("exists_number")
    private int existsNumber;
    @SerializedName("buy_limit")
    private int buyLimit;
    private long addToCartTime;
    private int cartCount;

    protected Product(Parcel in) {
        id = in.readInt();
        title = in.readString();
        description = in.readString();
        categoryId = in.readInt();
        cityId = in.readInt();
        fee = in.readString();
        fee2 = in.readString();
        barcodeType = in.readString();
        barcodeText = in.readString();
        unit = in.readString();
        image = in.readString();
        isActive = in.readInt();
        cartCount = in.readInt();
        isBookmarked = in.readByte() != 0;
        mainCategory = in.readInt();
        imageUrl = in.readString();
        existsNumber = in.readInt();
        buyLimit = in.readInt();
        addToCartTime = in.readLong();
        provider = in.readParcelable(Provider.class.getClassLoader());
    }




    public Product() {
        this.addToCartTime = Calendar.getInstance().getTime().getTime();
    }

    public Product(Product newProduct) {
        this.id = newProduct.id;
        this.title = newProduct.title;
        this.description = newProduct.description;
        this.categoryId = newProduct.categoryId;
        this.cityId = newProduct.cityId;
        this.fee = newProduct.fee;
        this.fee2 = newProduct.fee2;
        this.barcodeType = newProduct.barcodeType;
        this.barcodeText = newProduct.barcodeText;
        this.unit = newProduct.unit;
        this.image = newProduct.image;
        this.isActive = newProduct.isActive;
        this.mainCategory = newProduct.mainCategory;
        this.cartCount = newProduct.cartCount;
        this.isBookmarked = newProduct.isBookmarked;
        this.imageUrl = newProduct.imageUrl;
        this.existsNumber = newProduct.existsNumber;
        this.buyLimit = newProduct.buyLimit;
        this.addToCartTime = newProduct.addToCartTime;
    }



    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(id);
        dest.writeString(title);
        dest.writeString(description);
        dest.writeInt(categoryId);
        dest.writeInt(cityId);
        dest.writeString(fee);
        dest.writeString(fee2);
        dest.writeString(barcodeType);
        dest.writeString(barcodeText);
        dest.writeString(unit);
        dest.writeString(image);
        dest.writeInt(isActive);
        dest.writeInt(cartCount);
        dest.writeInt(mainCategory);
        dest.writeByte((byte) (isBookmarked ? 1 : 0));
        dest.writeString(imageUrl);
        dest.writeInt(existsNumber);
        dest.writeInt(buyLimit);
        dest.writeLong(addToCartTime);
        dest.writeValue(provider);
    }

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

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

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




}

这是我的提供者类:

public class Provider implements Parcelable {

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

        @Override
        public Provider[] newArray(int size) {
            return new Provider[size];
        }
    };
    private int id;
    @SerializedName("title")
    private String title;
    @SerializedName("description")
    private String description;
    @SerializedName("admin_id")
    private int admin_id;
    @SerializedName("provider_id")
    private int provider_id;
    @SerializedName("start1")
    private String start1;
    @SerializedName("start2")
    private String start2;
    @SerializedName("end1")
    private String end1;
    @SerializedName("end2")
    private String end2;

    protected Provider(Parcel in) {
        id = in.readInt();
        title = in.readString();
        description = in.readString();
        admin_id = in.readInt();
        provider_id = in.readInt();
        start1 = in.readString();
        start2 = in.readString();
        end1 = in.readString();
        end2 = in.readString();
    }



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

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeInt(id);
        parcel.writeString(title);
        parcel.writeString(description);
        parcel.writeInt(admin_id);
        parcel.writeInt(provider_id);
        parcel.writeString(start1);
        parcel.writeString(end1);
        parcel.writeString(start2);
        parcel.writeString(end2);

    }
}

将产品数组发送到ProductDetailActivity的代码:

Intent starter = new Intent(context, ProductDetailActivity.class);
starter.putParcelableArrayListExtra(Constants.ACTIVITY_EXTRA_PRODUCTS, new ArrayList<>(products));

context.startActivity(starter);

并最终在ProductDetailActivity中获得产品:

getIntent().getParcelableArrayListExtra(Constants.ACTIVITY_EXTRA_PRODUCTS)
android android-intent model parcelable
1个回答
0
投票

作为laalto,建议产品类(或任何Parcelable类)中数据的读取和写入顺序应相同。我将代码更改为此,并且效果很好:

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(id);
    dest.writeString(title);
    dest.writeString(description);
    dest.writeInt(categoryId);
    dest.writeInt(cityId);
    dest.writeString(fee);
    dest.writeString(fee2);
    dest.writeString(barcodeType);
    dest.writeString(barcodeText);
    dest.writeString(unit);
    dest.writeString(image);
    dest.writeInt(isActive);
    dest.writeInt(cartCount);
    dest.writeByte((byte) (isBookmarked ? 1 : 0));// Changed Order 
    dest.writeInt(mainCategory);                  // Changed Order
    dest.writeString(imageUrl);
    dest.writeInt(existsNumber);
    dest.writeInt(buyLimit);
    dest.writeLong(addToCartTime);
    dest.writeLong(now);
    dest.writeParcelable(provider, flags); // **Changed from writeValue to writeParcelable**
}
© www.soinside.com 2019 - 2024. All rights reserved.