android - readBooleanArray 抛出 RuntimeException ("bad array lengths")

标签 android boolean parcelable runtimeexception

我知道 parcelable 隐藏着一些 secret ,但没想到我需要知道它们,现在才知道。

这是我之前的代码:

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

提前致谢。

最佳答案

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

以下是如何在 Pracelable 中使用 boolean 值:

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

....

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

关于android - readBooleanArray 抛出 RuntimeException ("bad array lengths"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13463727/

相关文章:

android - 在 Android Honeycomb 上,如何将选项菜单添加到屏幕底部的主页栏?

language-agnostic - 在被证明之前是真的还是在被证明之前是假的?

android - 保存自定义对象的 ArrayList 并向 ArrayList 添加新对象

java - android调用上的 keystore 版本错误

android - 错误 : eglSurfaceAttrib not implemented

java - 定义真、假、未设置状态的最佳方法

java - boolean 值与整数的内存/大小?

Android:将对象从集合小部件传递到 Activity

android - 将可分割对象传递给 Intent 时丢失信息

android - 向左浮动 TextView 和 TableLayout