【问题标题】:RuntimeException when Unmarshalling Android Intent Parcelable解组 Android Intent Parcelable 时出现 RuntimeException
【发布时间】:2016-09-08 15:19:46
【问题描述】:

我有一个在活动之间传递的对象。在这个对象中有七个变量。 其中一个变量是来自另一个类的 ArrayList。

我在两者上都实现了 Parcelable。

以下是错误:

09-08 17:00:04.212 18965-18965/it.sinesy.padova33 E/AndroidRuntime: 致命异常: main 进程:it.sinesy.padova33,PID:18965 java.lang.RuntimeException: 无法启动活动 ComponentInfo{it.sinesy.padova33/org.thoughtcrime.securesms.ConversationListActivity}: java.lang.RuntimeException: Parcel android.os.Parcel@6e57f24: Unmarshalling unknown type code 7274612 at offset 548 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6077) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 引起:java.lang.RuntimeException: Parcel android.os.Parcel@6e57f24: Unmarshalling unknown type code 7274612 at offset 548 在 android.os.Parcel.readValue(Parcel.java:2443) 在 android.os.Parcel.readListInternal(Parcel.java:2778) 在 android.os.Parcel.readArrayList(Parcel.java:2035) 在 org.thoughtcrime.securesms.util.ChatIntentParamenters.(ChatIntentParamenters.java:50) 在 org.thoughtcrime.securesms.util.ChatIntentParamenters$1.createFromParcel(ChatIntentParamenters.java:80) 在 org.thoughtcrime.securesms.util.ChatIntentParamenters$1.createFromParcel(ChatIntentParamenters.java:77) 在 android.os.Parcel.readParcelable(Parcel.java:2470) 在 android.os.Parcel.readValue(Parcel.java:2364) 在 android.os.Parcel.readArrayMapInternal(Parcel.java:2717) 在 android.os.BaseBundle.unparcel(BaseBundle.java:269) 在 android.os.Bundle.getParcelable(Bundle.java:840) 在 android.content.Intent.getParcelableExtra(Intent.java:6239) 在 org.thoughtcrime.securesms.ConversationListActivity.onCreate(ConversationListActivity.java:94) 在 org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity.onCreate(PassphraseRequiredActionBarActivity.java:48) 在 android.app.Activity.performCreate(Activity.java:6664) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6077) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

这是我的 ChatIntentParamenters 类可打包代码:

package org.thoughtcrime.securesms.util;
import android.os.Parcel;
import android.os.Parcelable;
import org.thoughtcrime.securesms.contacts.PlatformContact;
import java.util.ArrayList;
public class ChatIntentParamenters implements Parcelable {
    public static final String FLAG_YES = "Y";
    public static final String FLAG_NO = "N";
    private String title;
    private String additionalTitle;
    private boolean canCreateGroups;
    private boolean canCreateMessages;
    private boolean canDeleteMessages;
    private boolean canInviteFriends;

    private ArrayList<PlatformContact> preloadedContacts;

    public ChatIntentParamenters(String title, String additionalTitle, boolean canCreateGroups, boolean canCreateMessages, boolean canDeleteMessages, boolean canInviteFriends, ArrayList<PlatformContact> preloadedContacts) {

        this.title = title;
        this.additionalTitle = additionalTitle;
        this.canCreateGroups = canCreateGroups;
        this.canCreateMessages = canCreateMessages;
        this.canDeleteMessages = canDeleteMessages;
        this.canInviteFriends = canInviteFriends;

        this.preloadedContacts = preloadedContacts;


    }

    public ChatIntentParamenters(Parcel parcel) {
        this.title = parcel.readString();
        this.additionalTitle = parcel.readString();

        this.canCreateGroups = parcel.readString().equals(FLAG_YES);
        this.canCreateMessages = parcel.readString().equals(FLAG_YES);
        this.canDeleteMessages = parcel.readString().equals(FLAG_YES);
        this.canInviteFriends = parcel.readString().equals(FLAG_YES);

        this.preloadedContacts = parcel.readArrayList(PlatformContact.class.getClassLoader());

    }



    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(title);
        dest.writeString(additionalTitle);

        dest.writeString(canCreateGroups?FLAG_YES:FLAG_NO);
        dest.writeString(canCreateMessages?FLAG_YES:FLAG_NO);
        dest.writeString(canDeleteMessages?FLAG_YES:FLAG_NO);
        dest.writeString(canInviteFriends?FLAG_YES:FLAG_NO);

        dest.writeList(preloadedContacts);

    }



    public final static Parcelable.Creator<ChatIntentParamenters> CREATOR = new Parcelable.Creator<ChatIntentParamenters>() {
        @Override
        public ChatIntentParamenters createFromParcel(Parcel source) {
            return new ChatIntentParamenters(source);
        }

        @Override
        public ChatIntentParamenters[] newArray(int size) {
            return new ChatIntentParamenters[size];
        }
    };


    public String getAdditionalTitle() {
        return additionalTitle;
    }

    public void setAdditionalTitle(String additionalTitle) {
        this.additionalTitle = additionalTitle;
    }

    public boolean isCanCreateGroups() {
        return canCreateGroups;
    }

    public void setCanCreateGroups(boolean canCreateGroups) {
        this.canCreateGroups = canCreateGroups;
    }

    public boolean isCanCreateMessages() {
        return canCreateMessages;
    }

    public void setCanCreateMessages(boolean canCreateMessages) {
        this.canCreateMessages = canCreateMessages;
    }

    public boolean isCanDeleteMessages() {
        return canDeleteMessages;
    }

    public void setCanDeleteMessages(boolean canDeleteMessages) {
        this.canDeleteMessages = canDeleteMessages;
    }

    public boolean isCanInviteFriends() {
        return canInviteFriends;
    }

    public void setCanInviteFriends(boolean canInviteFriends) {
        this.canInviteFriends = canInviteFriends;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public ArrayList<PlatformContact> getPreloadedContacts() {
        return preloadedContacts;
    }

    public void setPreloadedContacts(ArrayList<PlatformContact> preloadedContacts) {
        this.preloadedContacts = preloadedContacts;
    }
}

PlatformContact,作为 ArrayList 对象插入到 ChatIntentParamenters 中的第二个类:

package org.thoughtcrime.securesms.contacts;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Classe per passare la lista dei contatti a signal, in modo che non li prenda dai contatti del telefono
 * Created by filippoboatto on 06/09/16.
 */

public class PlatformContact implements Parcelable {
    private long contactId;
    private String firstName;
    private String lastName;
    private String phoneNumber;
    private String imageURI;

    public PlatformContact (long contactId, String firstName, String lastName, String phoneNumber, String imageURI){
        this.contactId = contactId;
        this.firstName = firstName;
        this.lastName = lastName;
        this.phoneNumber = phoneNumber;
        this.imageURI = imageURI;
    }

    public PlatformContact(Parcel parcel) {
        this.contactId = parcel.readInt();
        this.firstName = parcel.readString();
        this.lastName = parcel.readString();
        this.phoneNumber = parcel.readString();
        this.imageURI = parcel.readString();
    }



    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeLong(contactId);
        dest.writeString(firstName);
        dest.writeString(lastName);
        dest.writeString(phoneNumber);
        dest.writeString(imageURI);
    }



    public final static Creator<PlatformContact> CREATOR = new Creator<PlatformContact>() {
        @Override
        public PlatformContact createFromParcel(Parcel source) {
            return new PlatformContact(source);
        }

        @Override
        public PlatformContact[] newArray(int size) {
            return new PlatformContact[size];
        }
    };
}

然后使用以下代码将 ChatIntentParamenters 放入 Intent:

ChatIntentParamenters params = new ChatIntentParamenters(title, additionalTitle, canCreateGroups, canCreateMessages, canDeleteMessages, false, contactsList);
intent.putExtra(ConversationListActivity.INTENT_PARAMS, params);
getActivity().startActivity(intent);

当我在活动中获得额外的意图时出现错误:

ChatIntentParamenters params = intent.getParcelableExtra(INTENT_PARAMS);

【问题讨论】:

    标签: android arrays list arraylist parcelable


    【解决方案1】:

    尝试替换

    this.preloadedContacts = parcel.readArrayList(PlatformContact.class.getClassLoader())
    

        this.preloadedContacts= new ArrayList<>();
        parcel.readTypedList(this.preloadedContacts, PlatformContact.CREATOR);
    

        dest.writeList(preloadedContacts);
    

        dest.writeTypedList(preloadedContacts)
    

    【讨论】:

    • 好的,现在我有 ArrayList 但是当我使用 getParcelableExtra 读取它时,数​​组列表中的“PlatformContact”只有第一个具有值的属性,其他属性为空:ChatIntentParamenters params = intent.getParcelableExtra(INTENT_PARAMS);PlatformContact 可包裹类中,当我在 writeToParcel 上写入时,所有属性都已设置。
    • 除了您将 contactId 写为 long(64 位)并将其读取为 int(32 位)之外,我看不出还有什么问题.如果不是这样,您能否在创建 Parcelable 时确认这些字段中确实有值?
    • 将contactId的写入由int改为long,但其他属性仍为null
    • 我更新了原来的答案——改变了列表写入Parcel的方式
    • 已移除 Parcelable,现在我使用 JSON 字符串、putExtra 和 getStringExtra...它有效 :-)
    猜你喜欢
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    相关资源
    最近更新 更多