2012-11-19 124 views
1

我知道parcelable隱藏了一些祕密,但並沒有想到我需要知道它們,現在unitl。readBooleanArray拋出RuntimeException(「壞數組長度」)

以下是代碼之前,我有:

... 
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

剛剛嘗試使用createBooleanArray方法,它對我來說沒有意義,它是什麼對於%)。 –

回答

3

其實我發現我的問題的解決方案,但沒有回答另一個question

下面是如何與布爾在Pracelable你工作:

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

.... 

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

在2015年,我遇到了同樣的錯誤。我確信我以相同的順序寫和閱讀。 –

+0

在2017年,我遇到了同樣的錯誤。我確信我以相同的順序寫和閱讀。 – msangel

0

在開始從Parcel實例讀取數據之前,請調用setDataPosition方法。

例如,

in.setDataPosition(0); 
+0

不幸的是,這不是線索,因爲我已經成功讀取了上面所有行的所有值: \t \t gameId = in.readLong(); \t \t color = in.readInt(); \t \t whiteUsername = in.readString(); \t \t blackUsername = in.readString(); \t \t userNameStrLength = in。的readInt(); \t \t timeRemainingAmount = in.readInt(); \t \t timeRemainingUnits = in.readString(); in.readBooleanArray(booleans1); //從這裏開始 –

0

如果你有一個數組一個包裹,那麼write.....Array函數首先將數組的大小寫爲int,然後將值(布爾值爲int,它們可以是0或1)。所以如果你用一個1長度的數組調用函數3次(因爲第一個數組寫入4個整數,第二個讀取6個整數),你不能得到3長度的數組。

如果你打電話parcel.createBooleanArray(),你可以很容易地取回你的布爾值,它返回你放入包裹的數組,parcel.writeBooleanArray(boolean[])

+2

這個工具解決了大多數可解釋的問題http://devk.it/proj/parcelabler/ –