ClassCastException при попытке сделать readParcelable на пользовательский массив объектов



Я пытаюсь реализовать Parcelable вместо Serializable, поскольку это должно быть более эффективным. Из моей основной активности я хочу передать объект сообщения в другую активность, мое сообщение класса содержит другие классы.
Если я пройду мимо этой ошибки, я уверен, что столкнусь с гораздо большим их количеством, но прямо сейчас, когда я пытаюсь запустить свое приложение, я получаю



Это мой класс Сообщений:



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 Ява.яз..RuntimeException: не удается запустить
деятельность
ComponentInfo{com.образец.стимул / ком.образец.стимул.Комментарии}:
Ява.яз..ClassCastException: android.ос.Parcelable[] не может быть брошен
к ком.образец.стимул.messagemodel.Токены [] на
андроид.апп.ActivityThread.performLaunchActivity (ActivityThread.Ява: 1967)
около
андроид.апп.ActivityThread.handleLaunchActivity (ActivityThread.java: 1992)
на Андроиде.апп.ActivityThread.доступ$600 (ActivityThread.java: 127) на
андроид.апп.ActivityThread$H. handleMessage (ActivityThread.Ява: 1158)
на Андроиде.ос.Обработчик.dispatchMessage (обработчик.java: 99) at
андроид.ос.Петлитель.петля (Looper.java: 137) на
андроид.апп.ActivityThread.main (ActivityThread.java: 4441) на
Ява.яз..отражать.Метод.invokeNative (Native Method) at
Ява.яз..отражать.Метод.метод Invoke.java:511) на
ком.андроид.внутренний.ос.ZygoteInit$MethodAndArgsCaller.беги (Зиготеинит.java: 784)
на ком.андроид.внутренний.ос.Зиготеинит.главный (Зиготеинит.java: 551) около
далвик.система.NativeStart.main (Native Method), вызванный:
Ява.яз..ClassCastException: android.ос.Parcelable[] не может быть брошен
к ком.образец.стимул.messagemodel.Токены [] на
ком.образец.стимул.messagemodel.Сообщение.readFromParcel (сообщение.java: 94)
на ком.образец.стимул.messagemodel.Сообщение.(Сообщение.java: 35)
около
ком.образец.стимул.messagemodel.Сообщение$1.createFromParcel (сообщение.java: 100)
около
ком.образец.стимул.messagemodel.Сообщение$1.createFromParcel (сообщение.java:1)
на Андроиде.ос.Посылка.readParcelable (посылка.java: 1992) на
андроид.ос.Посылка.readValue (посылка.Ява: 1854) на
андроид.ос.Посылка.readMapInternal (посылка.java: 2094) на
андроид.ос.Пакет.unparcel (пачка.java: 223) на
андроид.ос.Пакет.getParcelable (связка.java: 1158) на
ком.образец.стимул.Комментарии.onCreate (комментарии.Ява: 67) на
андроид.апп.Деятельность.performCreate (деятельность.java: 4465) на
андроид.апп.Аппаратура.callActivityOnCreate(контрольно-измерительные приборы.java: 1049)
около
андроид.апп.ActivityThread.performLaunchActivity (ActivityThread.Ява: 1931 год)
... Еще 11




Я думаю, что сейчас уместно следующее:




Вызвано: java.яз..ClassCastException: android.ос.Parcelable[]
не может быть приведен к com.образец.стимул.messagemodel.Токены [] на
ком.образец.стимул.messagemodel.Сообщение.readFromParcel (сообщение.java: 94)




Так я, наверное, и делаю. это один неправильно:
жетоны = in.readParcelable (токены.класс.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 **/
}


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

633   2  

2 ответов:

Используйте writeTypedArray и readTypedArray для чтения и записи массива в посылку

Читать

tokens = in.createTypedArray(Tokens.CREATOR);

Написать

in.writeTypedArray(tokens, flags);

Попробуйте это...

Заменить

 tokens = in.readParcelable(Tokens.class.getClassLoader();

С

 tokens = in.readParcelableArray(Tokens.class.getClassLoader());

Вы пишете Parcelable массив, но читаете его как Parcelable

Comments

    Ничего не найдено.