Получение ClassCastException или IllegalStateException в isSelected - PullRequest
0 голосов
/ 07 февраля 2020
@SerializedName("profileName")
private String profileName;
@SerializedName("paused")
private boolean isPaused;
@SerializedName("numberOfDevices")
private int numberOfDevices;

private boolean isSelected;

public Profile(String profileName, Boolean isPaused, int numberOfDevices) {
    this.profileName = profileName;
    this.isPaused = isPaused;
    this.numberOfDevices = numberOfDevices;
}

protected Profile(Parcel in) {
    profileName = in.readString();
    isPaused = (boolean) in.readValue(boolean.class.getClassLoader());
    isSelected = (boolean) in.readValue(boolean.class.getClassLoader());
    numberOfDevices = in.readInt();
}

Так что в приведенном выше коде не знаю причину, почему я получаю classCastExcpetion на isSelected , а не в isPaused . Оба имеют одинаковые типы данных и используются одинаково. Пробовал искать его до сих пор не в состоянии разобраться в проблеме. Ниже приведены журналы для этого.

java.lang.IllegalStateException: Bundle length is not aligned by 4: 9
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3447)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3594)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2146)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:237)
    at android.app.ActivityThread.main(ActivityThread.java:7762)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1047)
 Caused by: java.lang.IllegalStateException: Bundle length is not aligned by 4: 9
    at android.os.BaseBundle.readFromParcelInner(BaseBundle.java:1615)
    at android.os.BaseBundle.<init>(BaseBundle.java:143)
    at android.os.Bundle.<init>(Bundle.java:95)
    at android.os.Parcel.readBundle(Parcel.java:2301)
    at android.os.Parcel.readValue(Parcel.java:2946)
    at models.Profile.<init>(Profile.java:27)
    at models.Profile$1.createFromParcel(Profile.java:34)
    at models.Profile$1.createFromParcel(Profile.java:31)
    at android.os.Parcel.readParcelable(Parcel.java:2990)
    at android.os.Parcel.readValue(Parcel.java:2883)
    at android.os.Parcel.readArrayMapInternal(Parcel.java:3261)
    at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:292)
    at android.os.BaseBundle.unparcel(BaseBundle.java:236)
    at android.os.Bundle.getParcelable(Bundle.java:951)

И странная часть в том, что я использую это для представления переработчика. Если я нажимаю на 1-й элемент в представлении переработчика, это дает ниже IllegalStateException, и если я нажимаю на любой другой элемент, я получаю ClassCastException, как показано ниже

java.lang.Short cannot be cast to java.lang.Boolean
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3447)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3594)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2146)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:237)
    at android.app.ActivityThread.main(ActivityThread.java:7762)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1047)
 Caused by: java.lang.ClassCastException: java.lang.Short cannot be cast to java.lang.Boolean
    at com.centurylink.ctl_droid_wrap.models.Profile.<init>(Profile.java:27)
    at com.centurylink.ctl_droid_wrap.models.Profile$1.createFromParcel(Profile.java:34)
    at com.centurylink.ctl_droid_wrap.models.Profile$1.createFromParcel(Profile.java:31)
    at android.os.Parcel.readParcelable(Parcel.java:2990)
    at android.os.Parcel.readValue(Parcel.java:2883)
    at android.os.Parcel.readArrayMapInternal(Parcel.java:3261)
    at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:292)
    at android.os.BaseBundle.unparcel(BaseBundle.java:236)
    at android.os.Bundle.getParcelable(Bundle.java:951)

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020
 protected Profile(Parcel in) {
    profileName = in.readString();
    isPaused = in.readByte() != 0;
    numberOfDevices = in.readInt();
    isSelected = in.readByte() != 0;
}

Я только что заменил приведенный выше код, и это решило проблему. Была некоторая проблема в вышеупомянутом классе.

0 голосов
/ 07 февраля 2020

У вас нет @SerializedName для isSelected. Он прочитает значение numberOfDevices и присвоит isSelected и вызовет исключение. Добавьте SerializedName для isSelected, и проблема исчезнет go.

...