【问题标题】:readBooleanArray throws RuntimeException("bad array lengths")readBooleanArray 抛出 RuntimeException("bad array lengths")
【发布时间】:2012-11-07 23:03:36
【问题描述】:

我知道 Parcelable 隐藏着一些秘密,但没想到我现在需要知道它们。

这是我之前的代码:

...
parcel.writeBooleanArray(new boolean[]{booleanValue1, booleanValue2, booleanValue3});
....

boolean[] booleans = new boolean[3];
in.readBooleanArray(booleans);
...

不知何故,它在除我之外的许多设备上停止工作,所以我无法重现它。然后我决定将其更改为:

        ...
    parcel.writeBooleanArray(new boolean[]{booleanValue1});
    parcel.writeBooleanArray(new boolean[]{booleanValue2});
    parcel.writeBooleanArray(new boolean[]{booleanValue3});
        ...

    boolean[] booleans1 = new boolean[1];
    boolean[] booleans2 = new boolean[1];
    boolean[] booleans3 = new boolean[1];
    in.readBooleanArray(booleans1);
    in.readBooleanArray(booleans2); // it crashes here
    in.readBooleanArray(booleans3);
        ....

Parcel源码:

public final void readBooleanArray(boolean[] val) {
    int N = readInt();
    if (N == val.length) {
        for (int i=0; i<N; i++) {
            val[i] = readInt() != 0;
        }
    } else {
        throw new RuntimeException("bad array lengths");
    }
}

LogCat 错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my/com.my.activities.MyActivity}: java.lang.RuntimeException: bad array lengths
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1970)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
    at android.app.ActivityThread.access$600(ActivityThread.java:128)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4517)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: bad array lengths
    at android.os.Parcel.readBooleanArray(Parcel.java:619)

所以我猜我需要将代码更改为:

...
parcel.writeBooleanArray(new boolean[]{booleanValue1, booleanValue2, booleanValue3});
....

boolean[] booleans1 = new boolean[1];
boolean[] booleans2 = new boolean[1];
boolean[] booleans3 = new boolean[1];
in.readBooleanArray(booleans1);
in.readBooleanArray(booleans2);
in.readBooleanArray(booleans3);
....

但这会有帮助吗?

Parcel.createBooleanArray() return boolean[] 的用法还有什么?也许我需要通过这种方法创建布尔数组,然后使用 writeBooleanArray(boolean[])?但这对我来说没有意义...为什么它可以在某些设备上运行而在其他设备上却不行...

提前致谢。

【问题讨论】:

  • 刚刚尝试使用 createBooleanArray 方法,但它对我来说没有意义 %)。

标签: android boolean parcelable runtimeexception


【解决方案1】:

在您开始从 Parcel 实例读取之前调用 setDataPosition 方法。

例如。

in.setDataPosition(0);

【讨论】:

  • 不幸的是,这不是线索,因为我已经成功读取了这些行之上的所有值:gameId = in.readLong();颜色 = in.readInt(); whiteUsername = in.readString(); blackUsername = in.readString(); userNameStrLength = in.readInt(); timeRemainingAmount = in.readInt(); timeRemainingUnits = in.readString(); in.readBooleanArray(booleans1);// 从这里开始
【解决方案2】:

实际上我找到了解决问题的方法,但没有在另一个question 中回答:

以下是您如何在 Pracelable 中使用布尔值:

.....
// Write:
out.writeByte((byte) (booleanValue ? 1 : 0));

....

// Read:
boolValue = in.readByte() == 1;

【讨论】:

  • 在 2015 年,我遇到了同样的错误。我确定我的写作和阅读顺序相同。
  • 在 2017 年,我遇到了同样的错误。我确定我的写作和阅读顺序相同。
  • 在 2019 年,我遇到了同样的错误。我确定我的写作和阅读顺序相同。
  • 2019 年。我确实按照相同的顺序写作和阅读。这是有效的。
【解决方案3】:

如果包裹中有一个数组,那么write.....Array 函数首先将数组的大小写为int,然后是值(如果是布尔值,则为ints,它们是0或 1)。因此,如果您使用 1 长度数组调用函数 3 次,则无法返回 3 长度数组(因为第一个写入 4 个整数,第二个读取 6 个整数)。

如果您调用parcel.createBooleanArray(),您可以轻松取回您的布尔值,这将返回您放入包裹中的数组parcel.writeBooleanArray(boolean[])

【讨论】:

    猜你喜欢
    • 2019-09-20
    • 2015-01-25
    • 2023-03-24
    • 2018-07-10
    • 2011-10-02
    • 2012-11-23
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    相关资源
    最近更新 更多