当前位置: 首页 > 知识库问答 >
问题:

Android中Bundle的错误幻数

百里海超
2023-03-14
 @Override
    public void execute(List<Report> reports, Questions question) {
        Intent replyIntent = new Intent(listener, ReplyActivity.class);
        replyIntent.putExtra("id", 0L);
        replyIntent.putExtra("questions", question);
        listener.openReportOk(question);
        listener.startActivity(replyIntent);
    }

Listener是回调的活动引用。

问题就是这堂课:

@Table(name = "Questions")
public class Questions extends Entity implements Parcelable {

    public static final Creator<Questions> CREATOR = new Creator<Questions>() {
        public Questions createFromParcel(Parcel source) {
            return new Questions(source);
        }

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

    @TableField(name = "idReport", datatype = DATATYPE_INTEGER)
    private int idReport;
    @TableField(name = "nameReport", datatype = DATATYPE_STRING)
    private String nameReport;
    @TableField(name = "replyGroups", datatype = DATATYPE_STRING)
    private String replyGroups;
    @TableField(name = "questionGroups", datatype = DATATYPE_ENTITY)
    private List<QuestionsGroup> questionsGroup;
    private Boolean canCreateNew;

    public Questions(int idReport, String nameReport, String replyGroups, List<QuestionsGroup> questionsGroup) {
        this.idReport = idReport;
        this.nameReport = nameReport;
        this.replyGroups = replyGroups;
        this.questionsGroup = questionsGroup;
        this.canCreateNew = false;
    }

    public Questions() {
        questionsGroup = new ArrayList<QuestionsGroup>();
    }

    private Questions(Parcel in) {
        this();
        this.idReport = in.readInt();
        this.nameReport = in.readString();
        this.replyGroups = in.readString();
        Bundle b = in.readBundle(QuestionsGroup.class.getClassLoader());
        this.questionsGroup = b.getParcelableArrayList("questionGroups");
        this.canCreateNew = (Boolean) in.readValue(Boolean.class.getClassLoader());
    }


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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(this.idReport);
        dest.writeString(this.nameReport);
        dest.writeString(this.replyGroups);
        Bundle b = new Bundle();
        b.putParcelableArrayList("questionGroups", (ArrayList<QuestionsGroup>) this.questionsGroup);
        dest.writeBundle(b);
        dest.writeValue(this.canCreateNew);
    }
}

当我在onCreate方法中收到包裹时:

 private void getData(Intent data) {
        ID = data.getExtras().getLong("id");
        questions = data.getExtras().getParcelable("questions");
    }
10-05 13:19:15.508    3499-3499/com.firext.android E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.firext.android, PID: 3499
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.firext.android/com.firext.android.activities.reply.ReplyActivity}: java.lang.IllegalStateException: Bad magic number for Bundle: 0x28
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2255)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2317)
            at android.app.ActivityThread.access$800(ActivityThread.java:143)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1258)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5070)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:836)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:631)
     Caused by: java.lang.IllegalStateException: Bad magic number for Bundle: 0x28
            at android.os.BaseBundle.readFromParcelInner(BaseBundle.java:1342)
            at android.os.BaseBundle.<init>(BaseBundle.java:90)
            at android.os.Bundle.<init>(Bundle.java:66)
            at android.os.Parcel.readBundle(Parcel.java:1645)
            at com.firext.android.domain.QuestionsGroup.<init>(QuestionsGroup.java:53)
            at com.firext.android.domain.QuestionsGroup$1.createFromParcel(QuestionsGroup.java:25)
            at com.firext.android.domain.QuestionsGroup$1.createFromParcel(QuestionsGroup.java:23)
            at android.os.Parcel.readParcelable(Parcel.java:2160)
            at android.os.Parcel.readValue(Parcel.java:2066)
            at android.os.Parcel.readListInternal(Parcel.java:2422)
            at android.os.Parcel.readArrayList(Parcel.java:1756)
            at android.os.Parcel.readValue(Parcel.java:2087)
            at android.os.Parcel.readArrayMapInternal(Parcel.java:2393)
            at android.os.BaseBundle.unparcel(BaseBundle.java:221)
            at android.os.Bundle.getParcelableArrayList(Bundle.java:782)
            at com.firext.android.domain.Questions.<init>(Questions.java:58)
            at com.firext.android.domain.Questions.<init>(Questions.java:18)
            at com.firext.android.domain.Questions$1.createFromParcel(Questions.java:22)
            at com.firext.android.domain.Questions$1.createFromParcel(Questions.java:20)
            at android.os.Parcel.readParcelable(Parcel.java:2160)
            at android.os.Parcel.readValue(Parcel.java:2066)
            at android.os.Parcel.readArrayMapInternal(Parcel.java:2393)
            at android.os.BaseBundle.unparcel(BaseBundle.java:221)
            at android.os.Bundle.getParcelable(Bundle.java:738)
            at com.firext.android.activities.reply.ReplyActivity.getData(ReplyActivity.java:72)
            at com.firext.android.activities.reply.ReplyActivity.onCreate(ReplyActivity.java:38)
            at android.app.Activity.performCreate(Activity.java:5720)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1102)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2208)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2317)
            at android.app.ActivityThread.access$800(ActivityThread.java:143)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1258)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5070)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:836)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:631)

共有1个答案

洪华皓
2023-03-14

看起来您在存储和检索QuestionsGroup的分组信息时出现了错误。53线是需要关注的线。

当写入包裹时,Android会与每个字段一起存储一个特殊的“神奇数字”,以确保您在从包裹中取出字段时使用正确的顺序(数字的定义请参见详细说明)。

您得到错误是因为在预期的位置没有找到神奇的数字-这是因为您没有按照正确的顺序从包中取出字段。

  • Android.googlesource.com上的BaseBundle

您还可以使用Android SDK管理器将代码的本地副本安装到您的开发机器上,我发现这非常有用。]

所以...

static final int BUNDLE_MAGIC = 0x4C444E42; // 'B' 'N' 'D' 'L'
void writeToParcelInner(Parcel parcel, int flags) {
    if (mParcelledData != null) {
        if (mParcelledData == EMPTY_PARCEL) {
            parcel.writeInt(0);
        } else {
            int length = mParcelledData.dataSize();
            parcel.writeInt(length);
            parcel.writeInt(BUNDLE_MAGIC);
            parcel.appendFrom(mParcelledData, 0, length);
        }
    } else {

   .......... extra code chopped out for illustration purposes

    }
}

类似地,当读取数据包时,Android会在返回数据包的值之前检查bundle_magic号。

private void readFromParcelInner(Parcel parcel, int length) {
    if (length == 0) {
        // Empty Bundle or end of data.
        mParcelledData = EMPTY_PARCEL;
        return;
    }
    int magic = parcel.readInt();
    if (magic != BUNDLE_MAGIC) {
        //noinspection ThrowableInstanceNeverThrown
        throw new IllegalStateException("Bad magic number for Bundle: 0x"
                + Integer.toHexString(magic));
    }

   .......... extra code chopped out for illustration purposes

}

在上面的API21 BaseBundle代码中,您可以看到根据logcat跟踪在第1342行抛出错误。

最初的海报声明questionsgroup是可以正确打包的。

如果代码仍然中断,则可能是questionsgroup代码。但是,此外,新的logcat跟踪将指向代码的不同部分,可以查看这些部分,并可能提供对问题的更多洞察力。

除非要捆绑,否则第1730行来自方法ReadFromParcelInner(),这将暗示相同的问题:

    int magic = parcel.readInt();
    if (magic != BUNDLE_MAGIC) {
        //noinspection ThrowableInstanceNeverThrown
        throw new IllegalStateException("Bad magic number for Bundle: 0x"
                + Integer.toHexString(magic));
    }

相关信息见以下帖子:

    null
 类似资料:
  • 问题内容: 什么是python中的“错误魔术数字” ImportError,如何解决? 我在网上可以找到的唯一东西表明,这是由于编译.py-> .pyc文件,然后尝试将其与错误版本的python一起使用而引起的。但是,就我而言,该文件有时可以很好地导入,而其他时候则不能,并且我不确定为什么。 python在回溯中提供的信息不是特别有用(这就是为什么我在这里询问…的原因),但是在这里它是有帮助的:

  • 问题内容: 什么是python中的“错误的魔术数字” ,如何解决? 我只能在网上找到的唯一东西表明,这是由于编译文件,然后尝试将其与错误版本的python一起使用而引起的。但是,就我而言,该文件似乎有时可以很好地导入,而其他时候则不能,并且我不确定为什么。 python在回溯中提供的信息并不是特别有用(这就是为什么我在这里询问…的原因),但在这里是有帮助的: 问题答案: 幻数来自UNIX类型的系统

  • 每个人。我有一个错误使用谷歌登录。首先,我喜欢一些教程。有这个例外。与Android Studio工作,所以我做了样品新(!)项目(Android Play Service)在哪里是谷歌登录,并有相同的例外。又不明白,到底是怎么了? 我也读到这个答案有决心。但我在任何地方都注销了,也许有人有代码解决这个问题。 告诉我,如果需要我的代码。谢谢你的理解。 这是我的密码 公共类GoogleActivit

  • 我使用ApacheFelix实现osgi包,并将其用作嵌入式Felix框架来调用boundle 这是我的maven插件,用于构建清单。MF: 我构建项目,然后像这样在嵌入式felix中使用jar文件 当我开始边界时,我得到了这个例外 线程“main”组织中出现异常。奥斯基。框架BundleException:无法解析a.b.c[1](R1.0):缺少要求[a.b.c[1](R1.0)]osgi。装

  • 问题内容: 我有这段代码,它返回“ temp”字符串。我想将此字符串解析为JSON对象,并且还向我的引用库中添加了JSON简单的1.1.1.jar。但是classnotfound错误和classdeffound错误显示在日志目录中。如何解决呢? 问题答案: 不要像这样添加jar文件。按照这些步骤 您应该尝试这样: Java中对项目中所有的引用 如果项目的根目录不存在,则创建一个文件夹。将文件夹复制