android - 自定义模式类中的 Parcelable 抛出 StackOverflow 错误

标签 android android-fragments parcelable stack-overflow

我想将对象从 fragment 传递到 Activity。

这是我的模态类::

import java.util.ArrayList;

import android.os.Parcel;
import android.os.Parcelable;

public class TopupProSectionName 
{
    private String sectionName;
    public ArrayList<Products> topupProductList ;
    private TopupProSectionName topupProSectionName;
    private TopupProSectionName.Products topupProducts;

    public TopupProSectionName(String name, ArrayList<Products> topupProductList)
    {
        super();
        this.sectionName = name;
        this.topupProductList = topupProductList;
    }

    public TopupProSectionName() 
    {
        topupProductList = new ArrayList<Products>();
        topupProSectionName=new TopupProSectionName();
        topupProducts = topupProSectionName.new Products();
    }

    public String getsectionName() {
        return sectionName;
    }
    public void setsectionName(String sectionName) {
        this.sectionName = sectionName;
    }

    public ArrayList<Products> getTopupProductList() {
        return topupProductList;
    }

    public void setTopupProductList(ArrayList<Products> topupProductList) {
        this.topupProductList = topupProductList;
    }

    public Products getTopupProducts() {
        return topupProducts;
    }
    public void setTopupProducts(TopupProSectionName.Products tp) {
        this.topupProducts = tp;
    }

    public class Products implements Parcelable
    {
        String systemServiceID;
        String systemServiceName;
        String productID;
        String productCode;
        String productName;
        String productDescription;
        String productType;
        String batchID;
        String minValue;
        String maxValue;
        String ImageURL;
        String surchargeType;
        String surchargeValue;

        public String getSystemServiceID()
        {
            return systemServiceID;
        }
        public void setSystemServiceID(String id)
        {
            this.systemServiceID=id;
        }
        public String getSystemServiceName()
        {
            return systemServiceName;
        }
        public void setSystemServiceName(String name)
        {
            this.systemServiceName=name;
        }

        public void setProductDesc(String productDesc)
        {
            this.productDescription=productDesc;
        }
        public String getProductDesc()
        {
            return productDescription;
        }

        public void setBatchID(String batchID)
        {
            this.batchID=batchID;
        }
        public String getBatchID()
        {
            return batchID;
        }

        public void setMinValue(String minValue)
        {
            this.minValue=minValue;
        }
        public String getminValue()
        {
            return minValue;
        }

        public void setMaxValue(String maxValue)
        {
            this.maxValue=maxValue;
        }
        public String getMaxValue()
        {
            return maxValue;
        }

        public String getProductID()
        {
            return productID;
        }
        public void setProductID(String ID)
        {
            productID=ID;
        }

        public String getProductCode() {
            return productCode;
        }
        public void setProductCode(String productCode) {
            this.productCode = productCode;
        }
        public String getProductName()
        {
            return productName;
        }
        public void setProductName(String name)
        {
            productName=name;
        }

        public String getProductType()
        {
            return productType;
        }
        public void setProductType(String type)
        {
            productType=type;
        }

        public String getImageURL()
        {
            return ImageURL;
        }
        public void setImageURL(String ImageURL)
        {
            this.ImageURL=ImageURL;
        }
        public String getSurchargeValue() {
            return surchargeValue;
        }
        public void setSurchargeValue(String surchargeValue) {
            this.surchargeValue = surchargeValue;
        }
        public String getSurchargeType() {
            return surchargeType;
        }
        public void setSurchargeType(String surchargeType) {
            this.surchargeType = surchargeType;
        }

        private Products(Parcel in) {
            topupProducts.setSystemServiceID(in.readString());
            topupProducts.setSystemServiceName(in.readString());
            topupProducts.setProductID(in.readString());
            topupProducts.setProductCode(in.readString());
            topupProducts.setProductDesc(in.readString());
            topupProducts.setProductName(in.readString());
            topupProducts.setProductDesc(in.readString());
            topupProducts.setProductType(in.readString());
            topupProducts.setBatchID(in.readString());
            topupProducts.setMinValue(in.readString());
            topupProducts.setMaxValue(in.readString());
            topupProducts.setImageURL(in.readString());
            topupProducts.setSurchargeType(in.readString());
            topupProducts.setSurchargeValue(in.readString());
        }

        public Products() {
            // TODO Auto-generated constructor stub
        }
        /*
         * you can use hashCode() here.
         */
        @Override
        public int describeContents() {
            return 0;
        }

        /*
         * Actual object Serialization/flattening happens here. You need to
         * individually Parcel each property of your object.
         */
        @Override
        public void writeToParcel(Parcel parcel, int flags) {
            parcel.writeString(topupProducts.getSystemServiceID());
            parcel.writeString(topupProducts.getSystemServiceName());
            parcel.writeString(topupProducts.getProductID());
            parcel.writeString(topupProducts.getProductCode());
            parcel.writeString(topupProducts.getProductName());
            parcel.writeString(topupProducts.getProductDesc());
            parcel.writeString(topupProducts.getProductType());
            parcel.writeString(topupProducts.getBatchID());
            parcel.writeString(topupProducts.getminValue());
            parcel.writeString(topupProducts.getMaxValue());
            parcel.writeString(topupProducts.getImageURL());
            parcel.writeString(topupProducts.getSurchargeType());
            parcel.writeString(topupProducts.getSurchargeValue());
        }

        /*
         * Parcelable interface must also have a static field called CREATOR,
         * which is an object implementing the Parcelable.Creator interface.
         * Used to un-marshal or de-serialize object from Parcel.
         */
        public final Parcelable.Creator<TopupProSectionName.Products> CREATOR =
                new Parcelable.Creator<TopupProSectionName.Products>() {
            public TopupProSectionName.Products createFromParcel(Parcel in) {
                return new TopupProSectionName.Products(in);
            }

            public TopupProSectionName.Products[] newArray(int size) {
                return new TopupProSectionName.Products[size];
            }
        };
    }
}

我传递的对象是这样的::

TopupProSectionName topupProSecName=new TopupProSectionName();
TopupProSectionName.Products Pro=topupProSecName.new Products();
Pro=listDataHeader.get(groupPosition).getTopupProducts();               
startActivityForResult(new Intent(ctx,TopupDialogActivity.class).putExtra("Product",Pro), 11);

在 Activity 中接收::

Products=(TopupProSectionName.Products) getIntent().getParcelableExtra("Product");

逻辑猫::

12-09 14:18:47.374: E/AndroidRuntime(28956): FATAL EXCEPTION: main
12-09 14:18:47.374: E/AndroidRuntime(28956): java.lang.StackOverflowError
12-09 14:18:47.374: E/AndroidRuntime(28956):    at java.util.AbstractList.<init>(AbstractList.java:383)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at java.util.ArrayList.<init>(ArrayList.java:90)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:24)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectionName.java:25)
12-09 14:18:47.374: E/AndroidRuntime(28956):    at com.mobifin.subscriber.modal.TopupProSectionName.<init>(TopupProSectio

知道为什么这个实现出错了吗?
任何帮助/建议将不胜感激...

提前致谢...

最佳答案

不要在 TopupProSectionName 类的构造函数中实例化 TopupProSectionName 字段。如果是这样,它将创建无限对象,因为每个 TopupProSectionName 对象将再次包含 TopupProSectionName...使用 setter 和 getter 方法将值赋给 TopupProSectionName 字段,Products 类中的 CREATOR 字段必须是静态的...

试试这个……它是不言自明的……

public class TopupProSectionName {
    private String sectionName;
    public ArrayList<Products> topupProductList;
    private TopupProSectionName topupProSectionName;
    private TopupProSectionName.Products topupProducts;

    public TopupProSectionName(String name, ArrayList<Products> topupProductList) {
        super();
        this.sectionName = name;
        this.topupProductList = topupProductList;
    }

    public TopupProSectionName() {
        topupProductList = new ArrayList<Products>();
        topupProducts = new TopupProSectionName.Products();
    }

    public String getsectionName() {
        return sectionName;
    }

    public void setsectionName(String sectionName) {
        this.sectionName = sectionName;
    }

    public ArrayList<Products> getTopupProductList() {
        return topupProductList;
    }

    public void setTopupProductList(ArrayList<Products> topupProductList) {
        this.topupProductList = topupProductList;
    }

    public Products getTopupProducts() {
        return topupProducts;
    }

    public void setTopupProducts(TopupProSectionName.Products tp) {
        this.topupProducts = tp;
    }

    public TopupProSectionName getTopupProSectionName() {
        return topupProSectionName;
    }

    public void setTopupProSectionName(TopupProSectionName topupProSectionName) {
        this.topupProSectionName = topupProSectionName;
    }

    public static class Products implements Parcelable {
        String systemServiceID;
        String systemServiceName;
        String productID;
        String productCode;
        String productName;
        String productDescription;
        String productType;
        String batchID;
        String minValue;
        String maxValue;
        String ImageURL;
        String surchargeType;
        String surchargeValue;

        public String getSystemServiceID() {
            return systemServiceID;
        }

        public void setSystemServiceID(String id) {
            this.systemServiceID = id;
        }

        public String getSystemServiceName() {
            return systemServiceName;
        }

        public void setSystemServiceName(String name) {
            this.systemServiceName = name;
        }

        public void setProductDesc(String productDesc) {
            this.productDescription = productDesc;
        }

        public String getProductDesc() {
            return productDescription;
        }

        public void setBatchID(String batchID) {
            this.batchID = batchID;
        }

        public String getBatchID() {
            return batchID;
        }

        public void setMinValue(String minValue) {
            this.minValue = minValue;
        }

        public String getminValue() {
            return minValue;
        }

        public void setMaxValue(String maxValue) {
            this.maxValue = maxValue;
        }

        public String getMaxValue() {
            return maxValue;
        }

        public String getProductID() {
            return productID;
        }

        public void setProductID(String ID) {
            productID = ID;
        }

        public String getProductCode() {
            return productCode;
        }

        public void setProductCode(String productCode) {
            this.productCode = productCode;
        }

        public String getProductName() {
            return productName;
        }

        public void setProductName(String name) {
            productName = name;
        }

        public String getProductType() {
            return productType;
        }

        public void setProductType(String type) {
            productType = type;
        }

        public String getImageURL() {
            return ImageURL;
        }

        public void setImageURL(String ImageURL) {
            this.ImageURL = ImageURL;
        }

        public String getSurchargeValue() {
            return surchargeValue;
        }

        public void setSurchargeValue(String surchargeValue) {
            this.surchargeValue = surchargeValue;
        }

        public String getSurchargeType() {
            return surchargeType;
        }

        public void setSurchargeType(String surchargeType) {
            this.surchargeType = surchargeType;
        }

        private Products(Parcel in) {
            setSystemServiceID(in.readString());
            setSystemServiceName(in.readString());
            setProductID(in.readString());
            setProductCode(in.readString());
            setProductDesc(in.readString());
            setProductName(in.readString());
            setProductDesc(in.readString());
            setProductType(in.readString());
            setBatchID(in.readString());
            setMinValue(in.readString());
            setMaxValue(in.readString());
            setImageURL(in.readString());
            setSurchargeType(in.readString());
            setSurchargeValue(in.readString());
        }

        public Products() {
            // TODO Auto-generated constructor stub
        }

        /*
         * you can use hashCode() here.
         */
        @Override
        public int describeContents() {
            return 0;
        }

        /*
         * Actual object Serialization/flattening happens here. You need to
         * individually Parcel each property of your object.
         */
        @Override
        public void writeToParcel(Parcel parcel, int flags) {
            parcel.writeString(getSystemServiceID());
            parcel.writeString(getSystemServiceName());
            parcel.writeString(getProductID());
            parcel.writeString(getProductCode());
            parcel.writeString(getProductName());
            parcel.writeString(getProductDesc());
            parcel.writeString(getProductType());
            parcel.writeString(getBatchID());
            parcel.writeString(getminValue());
            parcel.writeString(getMaxValue());
            parcel.writeString(getImageURL());
            parcel.writeString(getSurchargeType());
            parcel.writeString(getSurchargeValue());
        }

        /*
         * Parcelable interface must also have a static field called CREATOR,
         * which is an object implementing the Parcelable.Creator interface.
         * Used to un-marshal or de-serialize object from Parcel.
         */
        public static final Parcelable.Creator<TopupProSectionName.Products> CREATOR = new Parcelable.Creator<TopupProSectionName.Products>() {
            public TopupProSectionName.Products createFromParcel(Parcel in) {
                return new TopupProSectionName.Products(in);
            }

            public TopupProSectionName.Products[] newArray(int size) {
                return new TopupProSectionName.Products[size];
            }
        };
    }
}

并像这样为 Product 创建实例......

  TopupProSectionName topupProSecName=new TopupProSectionName();
  TopupProSectionName.Products Pro=new TopupProSectionName.Products();
  Pro=listDataHeader.get(groupPosition).getTopupProducts();               
  startActivityForResult(new Intent(ctx,TopupDialogActivity.class).putExtra("Product",Pro), 11)

关于android - 自定义模式类中的 Parcelable 抛出 StackOverflow 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20467037/

相关文章:

java - Android Parcelable 转换错误

android - 连线内存不足 : Java heap space error with ffmpeg library

android - Android API用于分析PCM数据?

android:fitsSystemWindows 不工作

Android错误膨胀类SwipeRefreshLayout

java - 可打包 writeToParcel() : What's the best way to write multiple variables of the same type?

android - 带组件的 AlertDialog 标题?

java - 对话框 fragment 使用改造更改密码

android - AppCompat 抽屉导航不让我关注任何 EditText

android - 将可分割对象传递给 Intent 时丢失信息