gpt4 book ai didi

java - Android 中 Bundle 的错误数字

转载 作者:搜寻专家 更新时间:2023-10-30 21:10:10 25 4
gpt4 key购买 nike

我使用此代码将数据从一个 Activity 传递到另一个 Activity :

 @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 是回调的 Activity 引用。

问题是这个类:

@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)

怎么了?

最佳答案

总结

您在存储和检索 QuestionsGroup 的分包信息方面似乎有误。第53行是需要注意的行。

写入包裹时,Android 会为每个字段存储一个特殊的“魔数(Magic Number)”,以确保您在从包裹中提取字段时使用正确的顺序(请参阅数字定义的详细说明)。

您收到错误是因为未在预期位置找到魔数(Magic Number) - 这是因为您没有按正确顺序从包裹中取出字段。


官方源码详解

[以下解释基于 BundleBaseBundle 类的“最新”(在撰写本文时)API21 实现。你可以在这里找到完整的代码:

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

所以...

写入包裹后,Android 会采取一些安全措施来确保在您尝试解包时字段对齐。为此,Android 为字段附加了一个“魔数(Magic Number)”,定义为:

static final int BUNDLE_MAGIC = 0x4C444E42; // 'B' 'N' 'D' 'L'

您可以在 writeToParcelInner() 的代码中看到这一点(总结如下)

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

}

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


解决方法和进一步调试

原始发帖人声明 QuestionsGroup 是可正确打包的。

进一步调试此问题的一种方法是放弃(当前)新的 API21,它引入了 BaseBundle 类;例如,API19 仅使用 Bundle 类。

如果用户的代码实际上是正确的,那么它更有可能在更成熟的 API 上工作。

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

除非是从方法 readFromParcelInner() 到 Bundle,第 1730 行,这意味着同样的问题:

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

相关文章

有关相关信息,请参阅以下帖子:

关于java - Android 中 Bundle 的错误数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26202149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com