[英]Use of ClassLoader in parcelable.readArrayList() in Android
[英]When to use parcelable in android?
我习惯于在ios中开发我永远不需要制作可模仿的模型,所以这个概念对我来说不是很清楚。 我有一个类“游戏”,如:
//removed the method to make it more readable.
public class Game implements Parcelable {
private int _id;
private ArrayList<Quest> _questList;
private int _numberOfGames;
private String _name;
private Date _startTime;
public Game(String name, ArrayList<Quest> quests, int id){
_name = name;
_questList = quests;
_numberOfGames = quests.size();
_id = id;
}
}
我想开始一个活动,并以我的意图将游戏对象传递给活动,但事实证明,默认情况下你不能传递自定义对象,但它们需要是可以分配的。 所以我添加了:
public static final Parcelable.Creator<Game> CREATOR
= new Parcelable.Creator<Game>() {
public Game createFromParcel(Parcel in) {
return new Game(in);
}
public Game[] newArray(int size) {
return new Game[size];
}
};
private Game(Parcel in) {
_id = in.readInt();
_questList = (ArrayList<Quest>) in.readSerializable();
_numberOfGames = in.readInt();
_name = in.readString();
_startTime = new Date(in.readLong());
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeInt(_id);
out.writeSerializable(_questList);
out.writeInt(_numberOfGames);
out.writeString(_name);
out.writeLong(_startTime.getTime());
}
但现在我得到警告,自定义arraylist _questList不是parcelable游戏。
Quest是一个抽象类,因此无法实现 。
public static final Parcelable.Creator<Game> CREATOR = new Parcelable.Creator<Game>() {
public Game createFromParcel(Parcel source) {
return new Game(source);
}
public Game[] newArray(int size) {
return new Game[size];
}
};
所以我的问题是:我什么时候需要实现parcelable,我是否必须将它添加到我想传递的每个自定义对象(即使在另一个自定义对象中)? 我无法想象他们没有更容易的东西来传递带有自定义对象数组列表的自定义对象。
正如您已经发现的,如果您想通过Intent发送自己的数据,您需要使其成为可能。 在Android上,建议使用Parcelable
。 您可以自己实现此界面,也可以使用Parceler或Parcelable Please等现有工具。 注意:这些工具有一些限制因此请确保您了解它们,因为有时手动实现Parcelable
可能更便宜,而不是编写代码来处理它。
只有可能的方式可以包容
不可以。您可以使用Serializable
(也可以使用Parcel),但Parcelable
可以用于Android,因为它更快,而且它是在平台级别上完成的。
我们假设Parcelable类似于Optimized Serializable,专为Android设计 ,Google建议使用Parcelable over Serializable。 Android操作系统使用Parcelable
iteself(例如:SavedState用于查看)。 手动实现Parcelable
有点痛苦,所以有一些有用的解决方案:
Android Parcerable Generator。 IntelliJ插件,为您的数据类实现Parcelable
东西(添加构造函数, CREATOR内部类,实现方法等)。 你可以在这里得到它。
Parceler。 基于注释的代码生成框架。 您必须为数据类和一些辅助方法使用@Parcel
注释。 更多信息在这里 。
Parcelable请。 基于注释的代码生成框架随IntelliJ插件一起提供。 我不建议使用它,因为它没有维持1年。
我个人使用第一个解决方案,因为它快速,简单,无需弄乱注释和变通方法。
您可能想阅读这篇文章 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.