Java Android:自定义Parcelable类使应用程序崩溃而不引发异常

Java Android:自定义Parcelable类使应用程序崩溃而不引发异常,java,android,android-activity,arraylist,parcelable,Java,Android,Android Activity,Arraylist,Parcelable,我有一个Android应用程序,带有自定义对象,实现了可包裹界面。我设置它的方式是,我的程序首先从包中的一个文件创建一个自定义类Products的ArrayList。我可以查看并确认arraylist及其实例变量已正确填充。这个类有几个实例变量,一个是另一个ArrayList,但另一个是String类。记住这个事实 我正在尝试将ArrayList传递到一个新的活动中,如下所示: try { Intent i = new Intent(RootActivity.this, P

我有一个Android应用程序,带有自定义对象,实现了可包裹界面。我设置它的方式是,我的程序首先从包中的一个文件创建一个自定义类
Products
ArrayList
。我可以查看并确认arraylist及其实例变量已正确填充。这个类有几个实例变量,一个是另一个
ArrayList
,但另一个是
String
类。记住这个事实

我正在尝试将
ArrayList
传递到一个新的活动中,如下所示:

  try {
         Intent i = new Intent(RootActivity.this, ProductsActivity.class);     //Intent from this activity to the next
         i.putParcelableArrayListExtra("Products", app_products);              //Puts my ArrayList<Class A> as an extra
         startActivity(i);                                                     //Launch the activity

       }
       catch(Exception e){
           Log.d("Activity Error", "Error Here:" + e.getMessage());
       }
对于我的自定义类,它与实现的Parcelable方法类似

public class Product implements Parcelable{
      private String name;
      private String cost;
      private ArrayList<String> similarItems;

      public Product{
            name = null;
            cost = null;
            similarItems = new ArrayList<String>();
      }

     public Product(String name, String cost){
            this();
            this.name = name;
            this.cost = cost;
     }

     public addSimilarItem(String item){
            similarItems.add(item);
     }

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

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

    public int describeContents(){
          return 0;
    }

    private Product(Parcel in){
         name = in.readString();
         cost = in.readString();
         similarItems = in.readArrayList(String.class.getClassLoader());
    }

    public void writeToParcel(Parcel out, int flags){
         out.writeString(name);
         out.writeString(cost);
         out.writeList(similarItems);
    }
}
公共类产品实现可包裹{
私有字符串名称;
私有字符串成本;
私人ArrayList相似项;
公共产品{
name=null;
成本=零;
similarItems=新的ArrayList();
}
公共产品(字符串名称、字符串成本){
这个();
this.name=名称;
成本=成本;
}
公共添加相似项(字符串项){
相似项。添加(项目);
}
公共静态最终包裹。创建者
=新的Parcelable.Creator()
{
公共产品createFromParcel(包裹中){
退回新产品(在);
} 
公共产品[]新数组(整数大小){
退回新产品[尺寸];
}
};
公共int描述内容(){
返回0;
}
私人产品(包裹内){
name=in.readString();
成本=in.readString();
similarItems=in.readArrayList(String.class.getClassLoader());
}
公共无效写入包(包出,内部标志){
out.writeString(名称);
减记资本(成本);
out.writeList(类似项);
}
}
因此,在类中不添加字符串arraylist的情况下,这可以很好地工作

注释掉
out.writeList(类似项)
similarItems=in.readArrayList(String.class.getClassLoader())

但是,一旦你将它们添加回类中,应用程序就会崩溃,但它甚至不会抛出调试消息。我把所有的东西都包装在了try catch语句中,android甚至没有报告应用程序在springboard上的正常对话框中崩溃。我真是不知所措

值得一提的是,我使用了一些日志语句来理解程序在哪里崩溃,尽管android不会抛出异常。我可以看到我的ArrayList中的所有项都经过writeToParcelMethod并完成了编写。永远不会调用Product(Parcel in)方法。最后,我还可以看到我正在启动新活动的类进入了暂停状态,并且我的新活动从未创建过


请告诉我是否可以提供任何其他信息。

这些信息似乎是由于我的应用程序用作资源的XML格式不正确造成的。不知道为什么会出现这个问题,但经过数小时的查找,我能够删除坏的XML,并将在稍后需要发布应用程序时重新讨论这个问题


现在,我只想继续开发它。如果我发现我的XML有什么有趣的地方,我会尽量记得在这里检查。

相当肯定您的问题是使用了
writeList()
writeList()
似乎表明,对于列表中包含的项目,它遵循与
writeValue()
相同的契约
readList()
但是,似乎表明值必须是
Parcelable
(而
String
不是)

无论采用哪种方式,通常这些调用都必须非常明确地链接到它们的逆函数(例如,
writeString()
必须使用
readString()
,而不是
readValue()
)读入,因此您应该使用提供的方法来读取/写入
String
列表

// Takes in a List<String> which may be null
out.writeStringList(similarItems);

// Returns either null or a new ArrayList<String> with the contents
similarItems = in.createStringArrayList();
//接收可能为空的列表
out.writeStringList(类似项);
//返回null或包含内容的新ArrayList
similarItems=in.createStringArrayList();

我也遇到过同样的问题,但不是每个例子都是这样吗?我对XML资源中的数百个条目使用这个方法,它们都使用上面列出的方法,只有一个除外。那么,这不意味着一个糟糕的资源条目吗?是的,如果它没有在其他地方引起问题,这是很有趣的。进一步研究,它看起来像
writeList
readArrayList
也应该正常工作(尽管它不是类型安全的,因为它只返回
ArrayList
)。不过,在
ArrayList
中不应该有任何东西会导致那样的崩溃。您能从崩溃中捕获日志并将其放在Github Gist的其他位置吗?它不是为我装的。(也许是pastebin?)
// Takes in a List<String> which may be null
out.writeStringList(similarItems);

// Returns either null or a new ArrayList<String> with the contents
similarItems = in.createStringArrayList();