【发布时间】: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