2

パーセルブルが何か秘密を隠していることは知っていましたが、それを知る必要があるとは思っていませんでした。

これが私が以前に持っていたコードです:

...
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 に答える
0

Parcel インスタンスから読み取りを開始する前に、setDataPositionメソッドを呼び出します。

例えば。

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