Java Android:自定义Parcelable类使应用程序崩溃而不引发异常
我有一个Android应用程序,带有自定义对象,实现了可包裹界面。我设置它的方式是,我的程序首先从包中的一个文件创建一个自定义类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
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();