writeTypedArray 및 ReadtyPedArray를 사용하여 배열을 읽고 쓰기를 읽고 씁니다.
읽다
tokens = in.createTypedArray(Tokens.CREATOR);
쓰다
in.writeTypedArray(tokens, flags);
문제
나는 더 효율적이기 때문에 Serializble 대신에 소포 가능한 구현을 시도하고 있습니다. Mainactivity에서 메시지 개체를 다른 활동으로 전달하고 싶습니다. 내 클래스 메시지에는 다른 클래스가 포함되어 있습니다. 이 오류를 지나면 더 많은 오류가있을 것이라고 확신하지만 지금은 앱을 실행하려고 할 때
이것은 내 메시지 클래스입니다.
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에 캐스트 할 수 없습니다. example.incentive.messagemodel.tokens [] at Android.app.act.Act.PormlaunchActivity (ActivityThread.java:1967)의 Android.app.Act.Act. activityThread.HandlElaunchActivity (ActivityThread.java:1992)의 Android.Act.Act.Accesss $ 600 .java : 127) Android.app.Act. Act. Act.Act. android.handler.dispatchmessage (handler.java:99)에서 Android.handler.loop.loop (looper.java : Java : Java : Java : Java : Java : 137) android.app.ActivityThread.Main (ActivityThread.java:4441)에서 java.lang.reflect.method.invokenative (java.lang.reflect.method.invoke)에서 COM에서 VOKENATIVE (기본 메소드) com.android.internal.os.zygoteinit.main (zygoteinit.java:551)의 com.Android.system.systeM.nativestart.main (기본 메소드)에 의한 : java.lang.classcastexception : android.os.parcelable []는 com.example.incentive.messagemodel.tokens []에서 com.example.incentive.messagemodel.message.ReadFromparcel (메시지. java : 94)에서 com.example.incentive.messagemodel.message. .Message $ 1. android.os.sparcelable (parcel.java:1992)에서 Android.os.readvalue (parcel.java:1854)에서 Android.os.sprel.sprel.readmapinternalal (parcel.java:2094) Android.os.bundle.unparcel (bld.java:223)에서 android.os.bundle.getParcelable (blendle.java:1158)의 com.example.incentive.comments.oncreate (주석. android.app.activity.performcreate (activity.java:4465)의 Java : 67) 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)에 캐스트 할 수 없습니다.
그래서 나는 이것을 잘못하고있을 것입니다 : tokens = 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 및 ReadtyPedArray를 사용하여 배열을 읽고 쓰기를 읽고 씁니다.
읽다
tokens = in.createTypedArray(Tokens.CREATOR);
쓰다
in.writeTypedArray(tokens, flags);
다른 팁
이 시도...
바꾸다
tokens = in.readParcelable(Tokens.class.getClassLoader();
~와 함께
tokens = in.readParcelableArray(Tokens.class.getClassLoader());
당신은 파 셀렉트 배열을 쓰고 있지만 그것을 말할 수있는 것으로 읽습니다.