我知道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 [])?但它对我来说没有意义......为什么它在某些设备上工作而在其他设备上没有...
提前致谢。
答案 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}}放入地块的数组。