Java 在android中何时使用parcelable?
我习惯于在ios中开发,在那里我永远不需要将模型打包,所以这个概念对我来说不是很清楚。 我有一个类“游戏”,比如:Java 在android中何时使用parcelable?,java,android,Java,Android,我习惯于在ios中开发,在那里我永远不需要将模型打包,所以这个概念对我来说不是很清楚。 我有一个类“游戏”,比如: //删除了该方法以使其更具可读性。 公共类游戏实现可包裹{ 私人内部id; 私人数组列表; 私人国际游戏; 私有字符串\u名称; 私人约会开始时间; 公共游戏(字符串名称、数组列表任务、整数id){ _名称=名称; _任务列表=任务; _numberOfGames=任务。大小(); _id=id; } } 我想启动一个活动,并按照我的意图将游戏对象传递给该活动,但结果表明,默认情
//删除了该方法以使其更具可读性。
公共类游戏实现可包裹{
私人内部id;
私人数组列表;
私人国际游戏;
私有字符串\u名称;
私人约会开始时间;
公共游戏(字符串名称、数组列表任务、整数id){
_名称=名称;
_任务列表=任务;
_numberOfGames=任务。大小();
_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());
}
公共静态最终包裹。创建者
=新的Parcelable.Creator(){
公共游戏createFromParcel(包裹中){
返回新游戏(中);
}
公共游戏[]新数组(整数大小){
返回新游戏[大小];
}
};
私人游戏(包裹内){
_id=in.readInt();
_.readSerializable()中的questList=(ArrayList);
_numberOfGames=in.readInt();
_name=in.readString();
_startTime=新日期(in.readLong());
}
@凌驾
公共int描述内容(){
返回0;
}
@凌驾
公共无效写入包(包出,内部标志){
out.writeInt(_id);
out.writeseriable(\u questList);
out.writeInt(_numberOfGames);
out.writeString(_name);
out.writeLong(_startTime.getTime());
}
但是现在我得到一个警告,定制的arraylist\u questList不是可包裹的游戏
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];
}
};
public static final Parcelable.Creator=新的Parcelable.Creator(){
公共游戏createFromParcel(包裹源){
返回新游戏(来源);
}
公共游戏[]新数组(整数大小){
返回新游戏[大小];
}
};
所以我的问题是:什么时候我需要实现parcelable,我是否必须将它添加到我想要传递的每个自定义对象中(即使是在另一个自定义对象中)?我无法想象他们没有什么东西能让android更容易地传递带有自定义对象数组列表的自定义对象。正如你已经发现的那样,如果你想通过Intent发送自己的数据,你需要让它成为可能。在Android上,建议使用
Parcelable
。您可以自己实现此接口,也可以使用现有的工具,如或注意:这些工具有一些限制,因此请确保您了解它们,因为有时手动实现Parcelable
可能比编写代码更便宜
是否只有一条路可以包裹
不可以。你可以使用Serializable
(也可以用于包裹),但是Parcelable
是Android上的一种方式,因为它速度更快,在平台级别上也是如此。比如说,它类似于为Android设计的优化Serializable,谷歌建议使用Parcelable而不是Serializable。Android操作系统使用Parcelable
iteself(例如:保存视图的状态)。手动实现Parcelable
有点痛苦,因此有一些有用的解决方案:
- Android可分配生成器。
IntelliJ插件,为您的数据类实现
功能(添加构造函数、创建者内部类、实现方法等)。你可以得到它Parcelable
- 包裹商。
基于注释的代码生成框架。您必须为数据类使用
注释和一些辅助方法。更多信息。@Parcel
- 请用包裹。 IntelliJ插件附带了基于注释的代码生成框架。我不建议使用它,因为它没有维护一年
您可能想阅读此文。我建议您使用Android parcelable Generator:@dominik4142是唯一可能的parcelable to方式吗?有几种方法可以实现这一点。最简单:您可以将此数据存储在应用程序单例中,该应用程序单例在整个应用程序生命周期中保持其状态,也可以将其存储在数据库中,并在活动之间仅传递某种标识符。不建议通过活动传递富对象,因为它会导致屏幕旋转,在屏幕之间移动非常缓慢。将数据存储在应用程序对象中是个坏主意,我不建议使用它来代替正确地执行可包裹任务需要可包裹。您应该使用writeTypedList。如果你想成为神级,你可以为你的应用程序使用迫击炮和迫击炮范围,并为你的游戏使用一个子范围来存储它的数据。与id一起使用的快速数据库是Realm。你有很多方法。
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];
}
};