【问题标题】:unmarshalling unknown type code android解组未知类型代码android
【发布时间】:2014-04-08 13:51:40
【问题描述】:

我需要使用 Intent 将对象列表从一个活动发送到其他活动。我已经通过 Parcelable 实现了我的课程:

public class ListMainActivityHolder implements Parcelable {
String title ;
String date ;
String url ;
public ListMainActivityHolder(){}

public void setTitle(String t){
    this.title = t ;
}
public ListMainActivityHolder(Parcel source){
    title = source.readString();
    setDate(source.readString());
    url   = source.readString();

}

public void setDate(String d){

    if(d.length()>40){
        d = d.substring(0, 30);
        d = d + "..." ;
    }

    this.date = extractDate(d) ;
}

public void setUrl(String u){
    this.url = u ;
}   

public String getUrl(String u){
    return this.url ;
}

public String getTitle(){
    return this.title;
}

public String getDate(){
    return this.date ;
}




public String extractDate(String date){
    String day , month , year;
    if(date.length()>10){
    day   = date.substring(5,7);
    month = date.substring(8,11);
    year  = date.substring(12, 16);

    if(month.equalsIgnoreCase("Jan")){
        month = "01" ;
    }else if(month.equalsIgnoreCase("Feb")){
        month = "02" ;
    }else if(month.equalsIgnoreCase("Mar")){
        month = "03" ;
    }else if(month.equalsIgnoreCase("Apr")){
        month = "04" ;
    }else if(month.equalsIgnoreCase("May")){
        month = "05" ;
    }else if(month.equalsIgnoreCase("Jun")){
        month = "06" ;
    }else if(month.equalsIgnoreCase("Jul")){
        month = "07" ;
    }else if(month.equalsIgnoreCase("Aug")){
        month = "08" ;
    }else if(month.equalsIgnoreCase("Sep")){
        month = "09" ;
    }else if(month.equalsIgnoreCase("Oct")){
        month = "10" ;
    }else if(month.equalsIgnoreCase("Nov")){
        month = "11" ;
    }else if(month.equalsIgnoreCase("Dec")){
        month = "12" ;
    }

    }else{
        day   = "20" ;
        month = "02" ;
        year  = "2014" ;
    }

    CalendarTool calender = new CalendarTool(Integer.parseInt(year), Integer.parseInt(month), Integer.parseInt(day));
    String newdate = calender.getIranianDate();
    return newdate ;

}

@Override
public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    // TODO Auto-generated method stub
    dest.writeString(title);
    dest.writeString(date);
    dest.writeString(url);
}

public static final Parcelable.Creator<ListMainActivityHolder> CREATOR 

= new Parcelable.Creator<ListMainActivityHolder>() {

    @Override
    public ListMainActivityHolder createFromParcel(Parcel source) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public ListMainActivityHolder[] newArray(int size) {
        // TODO Auto-generated method stub
        return new ListMainActivityHolder[size];
    }
};
}

在我的活动中:

Intent intent = getIntent();
listholder = intent.getParcelableExtra("MYLIST");
String str = listholder.get(1).getDate();
Log.e("Tag", str);

当我运行我的应用程序时,我得到了这些错误:

03-06 08:47:47.876: E/AndroidRuntime(3401): 致命异常: main 03-06 08:47:47.876: E/AndroidRuntime(3401): java.lang.RuntimeException:无法启动活动 组件信息{com.example.test/com.example.test.MainActivity}: java.lang.RuntimeException:包裹 android.os.Parcel@433bd068: 在偏移量 132 处解组未知类型代码 39

【问题讨论】:

标签: android android-intent parcelable


【解决方案1】:

在你的CREATOR 中,你有这个:

@Override
public ListMainActivityHolder createFromParcel(Parcel source) {
    // TODO Auto-generated method stub
    return null;
}

这意味着,每当 Android 尝试解组您的类时,您都会返回 null 而不是 ListMainActivityHolder 的实例。

您实际上需要像这样返回ListMainActivityHolder 的实例:

@Override
public ListMainActivityHolder createFromParcel(Parcel source) {
    return new ListMainActivityHolder(source);
}

【讨论】:

    【解决方案2】:

    您可以使用 android studio 插件将 class 设为 parcelable https://plugins.jetbrains.com/plugin/7332?pr=

    问题在于对象的写入和读取顺序...顺序应该相同,就像读取文件一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多