ReadBooleanArray throws RuntimeException ( "плохие длины массива" )
Я знал, что разумные скрывают что-то секретное, но не подумали, что мне нужно знать их, unitl теперь.
Вот код, который у меня был до:
...
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 [])? Но мне это не имеет смысла... почему он работает на некоторых устройствах и не работает на других...
Спасибо заранее.
Ответы
Ответ 1
На самом деле я нашел решение для своей проблемы, но не ответил в другом question:
Вот как вы можете работать с булевыми в Pracelable:
.....
// Write:
out.writeByte((byte) (booleanValue ? 1 : 0));
....
// Read:
boolValue = in.readByte() == 1;
Ответ 2
Прежде чем начать чтение из экземпляра Parcel, вызовите метод setDataPosition
.
Eg.
in.setDataPosition(0);
Ответ 3
Если у вас есть массив в пакете, то функции write.....Array
сначала записывают размер массива как int
, а затем значения (в случае булевых, int
s), которые либо равны 0 или 1). Таким образом, вы не можете вернуть массив длиной 3 длины, если вы вызываете функцию 3 раза с помощью массива длиной 1 (потому что первая пишет 4 ints, вторая - 6 ints).
Вы можете легко вернуть свои логические значения, если вы вызываете parcel.createBooleanArray()
, который возвращает массив, который вы помещаете в посылку с помощью parcel.writeBooleanArray(boolean[])
.