2012-11-19 4 views
1

나는 parcelable이 뭔가 비밀을 숨기고 있지만, 내가 그들을 알아야한다고 생각하지 않았다는 것을 알았습니다. 여기 readBooleanArray throws 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"); 
    } 
} 

로그 캣 오류 :

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()의 사용법은 부울 []을 반환합니다. 어쩌면 내가이 방법을 통해 부울 배열을 만들고 writeBooleanArray (부울 [])를 사용해야합니까? 하지만 그것은 나에게 이해가되지 않습니다 ... 왜 일부 장치에서 작동하고 다른 장치에서는 작동하지 않습니다 ...

미리 감사드립니다.

+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 회 호출하면 3 길이 배열을 다시 얻을 수 없습니다 (첫 번째 배열은 4 개의 정수를 쓰고 두 번째 배열은 6 개의 정수를 읽습니다).

parcel.createBooleanArray()으로 전화하면 parcel.writeBooleanArray(boolean[])이라는 소포에 넣은 배열을 반환하는 부울 값을 쉽게 얻을 수 있습니다.

+2

이 도구는 대부분의 문제를 해결했습니다 http://devk.it/proj/parcelabler/ –