Android:自定义Parcelable类在没有抛出异常的情况下崩溃应用程序

时间:2014-09-03 20:03:45

标签: java android android-activity arraylist parcelable

我有一个Android应用程序,其中包含实现Parcelable界面的自定义对象。我设置它的方式是我的程序最初从包中的文件创建自定义类ArrayList Products。我可以看到并确认arraylist及其实例变量标签是否适当填充。这个类有几个实例变量,另一个是另一个ArrayList,但有String类。记住这个事实。

我正在尝试将ArrayList<Product>传递给像这样的新活动:

  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());
       }

我通过使用

拉出ArrayList,从我的新活动中的意图中收回信息
     app_products = getIntent().getParcelableArrayListExtra("Products");

对于我的自定义类,它看起来像这样,以及实现的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被添加到类中

评论out.writeList(similarItems);以及similarItems = in.readArrayList(String.class.getClassLoader());

但是一旦你将它们重新添加到类中,应用程序崩溃了,但它甚至不会抛出一条消息进行调试。我已经在try-catch个语句周围包裹了所有内容,并且android甚至没有报告应用程序在跳板上的正常对话框崩溃。我真的很茫然。

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

如果我能提供任何其他信息,请告诉我。

2 个答案:

答案 0 :(得分:1)

相当确定您的问题是使用writeList()writeList()似乎表明它与writeValue()的合同遵循列表中包含的项目。但是,readList()似乎表明值必须为ParcelableString不是)。

无论哪种方式,通常这些调用都必须与其反向非常具体地相关联(例如writeString()必须使用readString(),而不是readValue()读取,因此您应该使用提供的读/写String List的方法:

// 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();

答案 1 :(得分:0)

这些似乎是由于我的应用程序用作资源的一些格式错误的XML。不知道为什么会出现这个问题,但经过几个小时的搜索后,我能够删除错误的XML,并在以后需要发布应用程序时再次访问此问题。

现在,我只是担心继续发展它。如果我发现有关我的XML的任何有趣内容,我会记得回头看看。