Guy*_*Guy 24 java eclipse android parcelable
我试图将Parcelable数据从一个意图传递到另一个意图,这是我得到的错误:
08-31 14:12:22.709: E/AndroidRuntime(9931): FATAL EXCEPTION: main
08-31 14:12:22.709: E/AndroidRuntime(9931): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.matejsoftware.cardscoretracker/com.matejsoftware.cardscoretracker.Igra}: android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.matejsoftware.cardscoretracker.Novaigra$Player
Run Code Online (Sandbox Code Playgroud)
问题是:我确实有Parcelable.Creator对象.我将在下面发布整个Parcelable代码:
public class Player implements Parcelable{
String name;
int score;
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(score);
}
public Player(Parcel source){
score = source.readInt();
name = source.readString();
}
public Player(int score, String name){
this.score = score;
this.name = name;
}
}
public class MyCreator implements Parcelable.Creator<Player> {
@Override
public Player createFromParcel(Parcel source) {
return new Player(source);
}
@Override
public Player[] newArray(int size) {
return new Player[size];
}
}
Run Code Online (Sandbox Code Playgroud)
CREATOR有什么不对吗?单击按钮开始下一个活动时,应用程序崩溃.
这就是我在第二个活动中"检索"Parcelable数据的方法:
//global variable
ArrayList<Player> playersParceledData;
//This is in onCreate
playersData = getIntent();
playersParceledData = playersData.getParcelableArrayListExtra("parceledData");
Run Code Online (Sandbox Code Playgroud)
另外,这是我将类对象放到ParcelableArrayListExtra的方式:
Player newPlayer = new Player(0, text);
playersParceledData.add(newPlayer);
zacniIgro.putParcelableArrayListExtra("parceledData", playersParceledData);
Run Code Online (Sandbox Code Playgroud)
Imt*_*ani 31
从包裹中读取时,您的顺序与您写入的顺序不同.
在writeToParcel()你首先放入String但是在HeatFriendDetail(Parcel in)第一次读取整数时.这不是正确的方法,因为订单或读/写很重要.
以下是在向/从Parcel写入/读取数据时执行正确顺序的代码(另请参阅此链接):
public class FriendDetail implements Parcelable {
private String full_name;
private int privacy;
public HeatFriendDetail(Parcel in) {
this.full_name = in.readString();
this.privacy = in.readInt();
}
public HeatFriendDetail() {
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.full_name);
dest.writeInt(this.privacy);
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public HeatFriendDetail createFromParcel(Parcel in) {
return new HeatFriendDetail(in);
}
public HeatFriendDetail[] newArray(int size) {
return new HeatFriendDetail[size];
}
};
// GETTER SETTER//
}
Run Code Online (Sandbox Code Playgroud)
我只在发布apk中收到此错误,因为CREATOR不公开.
我改变了这个:
static final Parcelable.Creator<Station> CREATOR = new Parcelable.Creator<Station>() {
Run Code Online (Sandbox Code Playgroud)
对此:
public static final Parcelable.Creator<Station> CREATOR = new Parcelable.Creator<Station>() {
Run Code Online (Sandbox Code Playgroud)
刚刚遇到这个。
我有一种预感,于是我查看了我的 ProGuard 映射文件。
通常我这样声明 CREATOR:
public static final Parcelable.Creator<ClassA> CREATOR =
new Parcelable.Creator<ClassA>() {
Run Code Online (Sandbox Code Playgroud)
它在映射文件中显示如下:
android.os.Parcelable$Creator CREATOR -> CREATOR
Run Code Online (Sandbox Code Playgroud)
..除了一个类之外,即报告错误的类。我是这样声明的:
public static Creator<ClassB> CREATOR =
new Creator<ClassB>() {
Run Code Online (Sandbox Code Playgroud)
你看:
android.os.Parcelable$Creator CREATOR -> a
Run Code Online (Sandbox Code Playgroud)
因此,如果您在生产版本中遇到此异常,请检查您的映射文件。我认为 ProGuard 在决定不混淆 CREATOR 时对 CREATOR 的声明方式非常敏感。