استخدم WriteTypedArray و evertypledarray لقراءة وصفيفك إلى الطرود
اقرأ
tokens = in.createTypedArray(Tokens.CREATOR);
يكتب
in.writeTypedArray(tokens, flags);
سؤال
أحاول تنفيذ الطرود بدلاً من Serializble لأنه من المفترض أن يكون أكثر كفاءة. من النشاط الرئيسي ، أريد نقل كائن رسالة إلى نشاط آخر ، تحتوي رسالة الفصل على فئات أخرى. إذا تجاوزت هذا الخطأ الواحد ، فأنا متأكد من أنني سأركض أكثر منهم ، لكن الآن عندما أحاول تشغيل تطبيقي ، أحصل على
هذه فئة الرسائل الخاصة بي:
import java.util.ArrayList;
import android.os.Parcel;
import android.os.Parcelable;
public class Message implements Parcelable {
int id;
int space_id;
String text;
String html;
String created_at;
int[] comments;
boolean is_liked;
int[] liked_by;
int[] starred_by;
boolean is_starred;
boolean is_followed;
int[] followed_by;
ArrayList<AttachmentsData> attachments;
String url;
int[] tags;
boolean is_system;
public User created_by;
public Permissions persmissions;
public Embed embed;
public Tokens[] tokens;
/** Parcelable **/
public Message(Parcel in) {
readFromParcel(in);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeInt(space_id);
dest.writeString(text);
dest.writeString(html);
dest.writeString(created_at);
dest.writeIntArray(comments);
dest.writeInt(is_liked ? 1 : 0);
dest.writeIntArray(liked_by);
dest.writeIntArray(starred_by);
dest.writeInt(is_starred ? 1 : 0);
dest.writeInt(is_followed ? 1 : 0);
dest.writeIntArray(followed_by);
dest.writeList(attachments);
dest.writeString(url);
dest.writeIntArray(tags);
dest.writeInt(is_system ? 1 : 0);
dest.writeParcelable(created_by, flags);
dest.writeParcelable(persmissions, flags);
dest.writeParcelable(embed, flags);
dest.writeParcelableArray(tokens, flags);
}
private void readFromParcel(Parcel in) {
id = in.readInt();
space_id = in.readInt();
text = in.readString();
html = in.readString();
created_at = in.readString();
//in.readIntArray(comments);
comments = in.createIntArray();
is_liked = in.readInt() == 0;
//in.readIntArray(liked_by);
liked_by = in.createIntArray();
//in.readIntArray(starred_by);
starred_by = in.createIntArray();
is_starred = in.readInt() == 0;
is_followed = in.readInt() == 0;
//in.readIntArray(followed_by);
followed_by = in.createIntArray();
in.readList(attachments, AttachmentsData.class.getClassLoader());
url = in.readString();
//in.readIntArray(tags);
tags = in.createIntArray();
is_system = in.readInt() == 0;
created_by = in.readParcelable(User.class.getClassLoader());
persmissions = in.readParcelable(Permissions.class.getClassLoader());
embed = in.readParcelable(Embed.class.getClassLoader());
tokens = in.readParcelable(Tokens.class.getClassLoader();
}
public static final Parcelable.Creator<Message> CREATOR = new Parcelable.Creator<Message>() {
public Message createFromParcel(Parcel in) {
return new Message(in);
}
public Message[] newArray(int size) {
return new Message[size];
}
};
/** Getters and setters, I'll spare you these **/
}
وهذا هو الخطأ الذي أحصل عليه:
استثناء فادح: main java.lang.runtimeexception: غير قادر على بدء تشغيل ComponentInfo {com.example.incentive/com.example.incentive.comments}: java.lang.classcastexception: Android.Os.Parcelable [] لا يمكن إلقاؤه إلى com. مثال. .java: 127) في Android.App.ActivityTheread $ H.HandleMessage (Activitythread.java:1158) at Android.Os.Handler.DispatchMessage (Handler.Java:99) في Android.Os.Looper.loop (looper.java: 137) في Android.App.Activitythread.main (ActivityThread.java:441) في java.lang.reflect.method.invokenistial (الطريقة الأصلية) في java.lang.reflect.method.invoke (method.java:511) في com .android.internal.os.zygoteinit $ methodandargscaller.run (zygoteinit.java:784) في com.android.internal.os.zygoteinit.main (الطريقة الأصلية) الناتجة عن: java.lang.classcastexception: Android.Os.Parcelable [] لا يمكن إلقاؤها إلى com.inpyampl.incentive.messagemodel.tokens [] في com.example.incentive.messagemodel.message.readfromparcel (الرسالة. Java: 94) في com.example.incentive.messagemodel.message. .message $ 1.createfromparcel (message.java:1) at Android.Os.Parcel.ReadParcelable (parcel.java:1992) at Android.OS.Parcel.readvalue (parcel.java:1854) at Android.Os.Parcel.readmapinternal (Parcel.java:2094) في Android.Os.Bundle.unparcel (bundle.java:23) في Android.Os.Bundle.getParcelable (bundle.java:1158) على com.example.incentive.oncreate (تعليقات. Java: 67) في Android.App.activity.performCreate (Activity.java:4465) في Android.App.instrumentation.CallActivityOncreate (Instrumentation.java:1049) في Android.App.ActivitythRead.performLaunchActivity (Activitythread.java:1931). .. 11 أكثر
أفكر في أن الشخص ذي الصلة الآن هو:
بسبب: java.lang.classcastexception: Android.os.Parcelable [] لا يمكن إلقاؤه إلى com.example.incentive.messagemodel.tokens [] في com.example.incentive.messagemodel.message.readfromparcel (message.java:94)
لذلك ربما أفعل هذا خطأ: الرموز = in.ReadParcelable (Tokens.class.getClassLoader () ؛
إليكم فئة الرموز الخاصة بي:
import android.os.Parcel;
import android.os.Parcelable;
public class Tokens implements Parcelable {
String type;
String value;
int start;
int end;
/** Parcelable related **/
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(type);
dest.writeString(value);
dest.writeInt(start);
dest.writeInt(end);
}
private Tokens(Parcel in) {
type = in.readString();
value = in.readString();
start = in.readInt();
end = in.readInt();
}
public static final Parcelable.Creator<Tokens> CREATOR = new Parcelable.Creator<Tokens>() {
public Tokens createFromParcel(Parcel in) {
return new Tokens(in);
}
public Tokens[] newArray(int size) {
return new Tokens[size];
}
};
/** Getters and setters **/
}
لقد بحثت طوال فترة ما بعد الظهر ولا أستطيع أن أجد كيفية القيام بذلك بشكل صحيح. هل يعلم أحد؟
المحلول
استخدم WriteTypedArray و evertypledarray لقراءة وصفيفك إلى الطرود
اقرأ
tokens = in.createTypedArray(Tokens.CREATOR);
يكتب
in.writeTypedArray(tokens, flags);
نصائح أخرى
جرب هذا...
يحل محل
tokens = in.readParcelable(Tokens.class.getClassLoader();
مع
tokens = in.readParcelableArray(Tokens.class.getClassLoader());
أنت تكتب مجموعة قابلة للطرد ولكن قراءتها قابلة للطرد