2

我知道 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[])?但这对我来说没有意义......为什么它可以在某些设备上运行而不能在其他设备上运行......

提前致谢。

4

3 回答 3

5

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

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

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

....

// Read:
boolValue = in.readByte() == 1;
于 2012-11-28T07:45:31.017 回答
1

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

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

于 2013-07-24T15:51:56.430 回答
0

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

例如。

in.setDataPosition(0);
于 2012-11-28T00:51:35.883 回答