writeTypedArrayとreadtypedArrayを使用して、アレイを小包に読み取り、書き込みます
読んだ
tokens = in.createTypedArray(Tokens.CREATOR);
書く
in.writeTypedArray(tokens, flags);
質問
より効率的であるはずであるため、Serializbleの代わりにParcelableを実装しようとしています。 MainActivityから、メッセージオブジェクトを別のアクティビティに渡したいと考えています。クラスメッセージには他のクラスが含まれています。私がこの1つのエラーを過ぎた場合、私はそれらをもっとたくさん走らせると確信していますが、今はアプリを実行しようとするとき、私は取得します
これは私のメッセージクラスです:
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.activitythread.performlaunchactivity(Activitythread.java:1967)at android.app.activitythread.handlelaunchactivity(Activitythread.java:1992)at android.App.App.Apt.Apt.Apt.Apt.Apt.Apt.Apt.Apt.Apt.Apt.Apt.Apt.Apt.Apt.Apt.Apt.Apt.Apt.Apt.Apt.Apt.Apcivity .java:127)at android.app.activityThread $ h.handlemessage(activitythread.java:1158)at android.os.handler.dispatchmessage(handler.java:99)at android.os.looper.loop(looper.java: 137)at android.app.activitythread.main(Activitythread.java:4441)at java.lang.lang.refllect.method.invokenative(native method)at java.lang.lang.refllect.method.invoke(method.java:511)at com .android.internal.os.zygoteinit $ methodandargscaller.run(zygoteinit.java:784)at com.android.internal.os.zygoteinit.main(zygoteinit.java:551)at dalvik.system.system.system.system (ネイティブ方法)原因:java.lang.classcastexception:android.os.parcelable []は、com.example.incample.incentive.messagemodel.messagemodel.message.redfromparcel(メッセージ)でcom.example.incentive.messagemodel.tokens []にcastできません。 Java:94)com.example.incentive.messagemodel.message。(message.java:35)at com.example.incentive.messagemodel.message $ 1.createfromparcel(message.java:100)at com.example.incentive.messagemodel .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.s.parcel.readmapinalternalternalternalternalternalternalternalternalternalternalternalternalternalternalternalter (Parcel.java:2094)at android.os.bundle.unparcel(bundle.java:223)at android.os.os.bundle.getParcelable(bundle.java:1158)のcom.example.incentive.comments.oncreate(コメント。 Java:67)Android.App.Activity.PerformCreate(Activity.java:4465)at android.app.instrumentation.callactivityoncreate(instrumentation.java:1049)at android.app.activitythread.performlaunchactivity(activitythread.java:1931)。 .. 11その他
関連するものは今だと思います:
原因:java.lang.classcastexception:android.os.parcelable []は、com.example.incample.incentive.messagemodel.message.readfromparcel(message.java:94)でcom.example.incentive.messagemodel.tokens []にキャストできません。
だから私はおそらくこれを間違っています: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());
あなたは小包の配列を書いていますが、それを小包として読んでいます