Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在android中何时使用parcelable?_Java_Android - Fatal编程技术网

Java 在android中何时使用parcelable?

Java 在android中何时使用parcelable?,java,android,Java,Android,我习惯于在ios中开发,在那里我永远不需要将模型打包,所以这个概念对我来说不是很清楚。 我有一个类“游戏”,比如: //删除了该方法以使其更具可读性。 公共类游戏实现可包裹{ 私人内部id; 私人数组列表; 私人国际游戏; 私有字符串\u名称; 私人约会开始时间; 公共游戏(字符串名称、数组列表任务、整数id){ _名称=名称; _任务列表=任务; _numberOfGames=任务。大小(); _id=id; } } 我想启动一个活动,并按照我的意图将游戏对象传递给该活动,但结果表明,默认情

我习惯于在ios中开发,在那里我永远不需要将模型打包,所以这个概念对我来说不是很清楚。 我有一个类“游戏”,比如:

//删除了该方法以使其更具可读性。
公共类游戏实现可包裹{
私人内部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插件附带了基于注释的代码生成框架。我不建议使用它,因为它没有维护一年

就我个人而言,我使用第1种解决方案,因为它快速、简单,并且不需要打乱注释和解决方法


您可能想阅读此文。

我建议您使用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];
    }
};