解组未知类型代码

时间:2013-09-11 06:16:25

标签: android android-intent

我基本上要做的是将Parcelable对象作为Intent extra传递。

这是我传递的地方,

final Intent intent = new Intent(_context,
                    AddReminderActivity.class);

            final Bundle bundle = new Bundle();
            bundle.putString(AddReminderActivity.EXTRA_MODE, AddReminderActivity.MODE_EDIT);
            bundle.putParcelable(AddReminderActivity.EXTRA_REMINDER, _reminders.get(position));

            intent.putExtras(bundle);
            _context.startActivity(intent);

_remindersArrayList<Reminder>

这是我的Reminder班级

package au.com.elegantmedia.vetcheck.objects;

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


public class Reminder implements Parcelable {

    private long _id;
    private String _message = "n/a";
    private String _medication = "n/a";
    private String _dosage = "n/a";
    private String _date = "n/a";
    private String _time = "n/a";
    private int _repeatID = 0;  // 1-once, 2-hourly, 3-daily, 4-weekly, 5-monthly
    private String _repeat = "n/a";
    private int _requestCode = 0;

    private static int REPEAT_ID_ONCE = 1;
    private static String REPEAT_ONCE = "once";
    private static int REPEAT_ID_HOURLY = 2;
    private static String REPEAT_HOURLY = "hourly";
    private static int REPEAT_ID_DAILY = 3;
    private static String REPEAT_DAILY = "daily";
    private static int REPEAT_ID_WEEKLY = 4;
    private static String REPEAT_WEEKLY = "weekly";
    private static int REPEAT_ID_MONTHLY = 5;
    private static String REPEAT_MONTHLY = "monthly";

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

    public Reminder(Parcel source) {
        _id = source.readInt();
        _message = source.readString();
        _medication = source.readString();
        _dosage = source.readString();
        _date = source.readString();
        _time = source.readString();
        _repeatID = source.readInt();
        _repeat = source.readString();
        _requestCode = source.readInt();
    }

    public long getID() {
        return _id;
    }

    public void setID(long id) {
        _id = id;
    }

    public String getMessage() {
        return _message;
    }

    public void setMessage(String message) {
        if(!message.equals("")) {
            _message = message;
        }
    }

    public String getMedication() {
        return _medication;
    }

    public void setMedication(String medication) {
        if(!medication.equals("")) {
            _medication = medication;
        }
    }

    public String getDosage() {
        return _dosage;
    }

    public void setDosage(String dosage) {
        if(!dosage.equals("")) {
            _dosage = dosage;
        }
    }

    public String getDate() {
        return _date;
    }

    public void setDate(String date) {
        if(!date.equals("")) {
            _date = date;
        }
    }

    public String getTime() {
        return _time;
    }

    public void setTime(String time) {
        if(!time.equals("")) {
            _time = time;
        }
    }

    public void setRepeatID(String repeat) {
        if(repeat.equals(REPEAT_ONCE)) {
            _repeatID = REPEAT_ID_ONCE;
        }
        else if(repeat.equals(REPEAT_HOURLY)) {
            _repeatID = REPEAT_ID_HOURLY;
        }
        else if(repeat.equals(REPEAT_DAILY)) {
            _repeatID = REPEAT_ID_DAILY;
        }
        else if(repeat.equals(REPEAT_WEEKLY)) {
            _repeatID = REPEAT_ID_WEEKLY;
        }
        else if(repeat.equals(REPEAT_MONTHLY)) {
            _repeatID = REPEAT_ID_MONTHLY;
        }
    }

    public int getRepeatID() { 
        return _repeatID;
    }

    public void setRepeat(int repeatID) {
        _repeatID = repeatID;

        if(repeatID == REPEAT_ID_ONCE) {
            _repeat = REPEAT_ONCE;
        }
        else if(repeatID == REPEAT_ID_HOURLY) {
            _repeat = REPEAT_HOURLY;
        }
        else if(repeatID == REPEAT_ID_DAILY) {
            _repeat = REPEAT_DAILY;
        }
        else if(repeatID == REPEAT_ID_WEEKLY) {
            _repeat = REPEAT_WEEKLY;
        }
        else if(repeatID == REPEAT_ID_MONTHLY) {
            _repeat = REPEAT_MONTHLY;
        }
    }

    public String getRepeat() {
        return _repeat;
    }

    public void setRequestCode(int requestID) {
        _requestCode = requestID;
    }

    public int getRequestCode() {
        return _requestCode;
    }

    // parceling part
    public static final Parcelable.Creator<Reminder> CREATOR = new Parcelable.Creator<Reminder>() {

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

        @Override
        public Reminder[] newArray(int size) {
            return new Reminder[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeLong(_id);
        dest.writeString(_message);
        dest.writeString(_medication);
        dest.writeString(_dosage);
        dest.writeString(_date);
        dest.writeString(_time);
        dest.writeInt(_repeatID);
        dest.writeInt(_requestCode);
    }
}

我遇到的问题是,当从调用者活动传递包时,就像这样,

Bundle[{reminder=au.com.elegantmedia.vetcheck.objects.Reminder@41fade98, mode=edit}]

表示所有内容都按预期设置,但在尝试从被调用者活动(final Bundle bundle = getIntent().getExtras();)访问附加内容时,如下所示,

Bundle[mParcelledData.dataSize=308]

然后我尝试按如下方式访问该包,

if(bundle.getString(EXTRA_MODE).equals(MODE_ADD)) {

        }
        else if(bundle.getString(EXTRA_MODE).equals(MODE_EDIT)) {
            final Reminder reminder = getIntent().getParcelableExtra(EXTRA_REMINDER);
            populateData(reminder);
        }

我遇到以下异常

E/AndroidRuntime(17991): Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@416ee8b0: Unmarshalling unknown type code 6357102 at offset 172

这是我对Parcelable对象的第一次尝试,所以我很少知道这意味着什么,谷歌搜索几个小时并没有完全帮助缩小问题范围。

1 个答案:

答案 0 :(得分:24)

您的_id类型为long,并且您将其解组为int类型:

    _id = source.readInt();

不应该

    _id = source.readLong();

我还注意到您的阅读顺序与将其写入包裹的顺序不同。编组时不会将_repeat写入包裹。