readBooleanArray抛出RuntimeException(“错误的数组长度”)

时间:2012-11-19 22:46:20

标签: android boolean parcelable runtimeexception

我知道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);
        ....

包裹的源代码:

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()的用法是什么,返回boolean [];也许我需要通过这个方法创建布尔数组然后使用writeBooleanArray(boolean [])?但它对我来说没有意义......为什么它在某些设备上工作而在其他设备上没有...

提前致谢。

3 个答案:

答案 0 :(得分:3)

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

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

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

....

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

答案 1 :(得分:0)

在开始阅读Parcel实例之前,请调用setDataPosition方法。

例如

in.setDataPosition(0);

答案 2 :(得分:0)

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

如果您致电parcel.createBooleanArray(),您可以轻松取回布尔值,该parcel.writeBooleanArray(boolean[])会返回您使用{{1}}放入地块的数组。