如何在 Java 代码中使用 Parcelable
How to use Parcelable in Java Code
我在 Android Studio 中有一个多模块项目,并在纯 java 模块中定义我的业务对象(我想在 ui 中使用的 POJO 对象) (称为 "application")。最终产品将是一个连接到服务器的 Android 应用程序。
我的应用程序结构如下(我有一个多层架构,而每一层代表一个模块):
Project
- presentation (android ui)
- application (logic / mapping DTO <--> Business Objects (POJOs))
- data (mapping JSON <--> Data Transfer Object (DTO))
- transport (network communication)
下面的 3 个模块是纯 java / 只有第一个是 Android 模块。
现在我的问题是:
我如何仍然对提到的 POJO 使用 Android 的 Parcelable(在纯 java 模块中)。是否存在 gradle 依赖项?直到现在我才找到任何东西,所以它会很感激一些有用的提示。
我不想使用 Serializable 并且不想将模块更改为 Android 模块。
更新:我试图在 java 模块中实现 Parcelable(它确实可以正常工作,但是当 building 时它无法识别 android.os.Parcelable。所以我回到问题的开头。
更新 II:尝试 Parceler 之类的答案不起作用,因为 android.os.Parcelable 在模块中无法识别。我不是在寻找如何实现 Parcelable 的答案,而是在寻找如何能够在纯 Java 中使用 Parcelable 的答案。谢谢
解决方案:见下文...
我强烈建议不要使用 Parcelable
。我用了很多。如果您不打算在 Android 中使用 IPC,请避免使用它。如果您不打算在 Android 进程之间传递这些对象,则不需要实现 Parcelable
.
如果要在Android个进程之间传递对象,那么Parcelable
是必须的。你应该看看 AIDL。请注意,类 仍然必须实现 Parcelable
,即使您使用 AIDL。
你不需要任何特殊的依赖,Android SDK 就足够了。
编辑:
我知道链接文档说 "If you do not need to perform concurrent IPC across different applications, you should create your interface by implementing a Binder or, if you want to perform IPC, but do not need to handle multithreading, implement your interface using a Messenger"。根据我的经验,我不同意这个建议。使用绑定服务和 Messenger
是一条充满隐藏陷阱的痛苦之路。 AIDL 更容易实施。
我不太明白您要归档的内容,但是您可以使用 gson 轻松地在 android 进程甚至 ws 之间进行通信。
只需转换您的对象json 使用 gson(它根据你的 pojo 自动执行)并从 json 转换为另一侧的对象。
如果您正在寻找一种将 POJO 包装为 Parcelable
的简单方法,请尝试 Parceler。 Parceler 是一个注释处理器,它根据您的 POJO 模型的字段生成 Parcelable
s classes.
要让 Parceler 为您的纯 java 库生成 Parcelable
s,请在您的 Android 特定源代码(演示文稿?)中使用 @ParcelClass
注释来指示将 POJO 用作模型的 Parceler。
从 Parceler 生成的 Parcelable
输出中,您可以直接使用生成的 classes,或者通过 Parcels.wrap()
和 Parcels.unwrap()
实用程序 class并将数据序列化为 Bundle
.
O.K.,它现在正在工作。我终于意识到在 Android 应用程序中 运行 纯 java 模块是不可能的,你总是必须应用 android 库插件而不是 java插件:
apply plugin: 'com.android.library'
我还必须添加一个 Manifest.xml 并将以下内容添加到 java 模块的 build.gradle 中:
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
minSdkVersion 16
targetSdkVersion 21
}
}
我在 Android Studio 中有一个多模块项目,并在纯 java 模块中定义我的业务对象(我想在 ui 中使用的 POJO 对象) (称为 "application")。最终产品将是一个连接到服务器的 Android 应用程序。
我的应用程序结构如下(我有一个多层架构,而每一层代表一个模块):
Project
- presentation (android ui)
- application (logic / mapping DTO <--> Business Objects (POJOs))
- data (mapping JSON <--> Data Transfer Object (DTO))
- transport (network communication)
下面的 3 个模块是纯 java / 只有第一个是 Android 模块。
现在我的问题是: 我如何仍然对提到的 POJO 使用 Android 的 Parcelable(在纯 java 模块中)。是否存在 gradle 依赖项?直到现在我才找到任何东西,所以它会很感激一些有用的提示。
我不想使用 Serializable 并且不想将模块更改为 Android 模块。
更新:我试图在 java 模块中实现 Parcelable(它确实可以正常工作,但是当 building 时它无法识别 android.os.Parcelable。所以我回到问题的开头。
更新 II:尝试 Parceler 之类的答案不起作用,因为 android.os.Parcelable 在模块中无法识别。我不是在寻找如何实现 Parcelable 的答案,而是在寻找如何能够在纯 Java 中使用 Parcelable 的答案。谢谢
解决方案:见下文...
我强烈建议不要使用 Parcelable
。我用了很多。如果您不打算在 Android 中使用 IPC,请避免使用它。如果您不打算在 Android 进程之间传递这些对象,则不需要实现 Parcelable
.
如果要在Android个进程之间传递对象,那么Parcelable
是必须的。你应该看看 AIDL。请注意,类 仍然必须实现 Parcelable
,即使您使用 AIDL。
你不需要任何特殊的依赖,Android SDK 就足够了。
编辑:
我知道链接文档说 "If you do not need to perform concurrent IPC across different applications, you should create your interface by implementing a Binder or, if you want to perform IPC, but do not need to handle multithreading, implement your interface using a Messenger"。根据我的经验,我不同意这个建议。使用绑定服务和 Messenger
是一条充满隐藏陷阱的痛苦之路。 AIDL 更容易实施。
我不太明白您要归档的内容,但是您可以使用 gson 轻松地在 android 进程甚至 ws 之间进行通信。
只需转换您的对象json 使用 gson(它根据你的 pojo 自动执行)并从 json 转换为另一侧的对象。
如果您正在寻找一种将 POJO 包装为 Parcelable
的简单方法,请尝试 Parceler。 Parceler 是一个注释处理器,它根据您的 POJO 模型的字段生成 Parcelable
s classes.
要让 Parceler 为您的纯 java 库生成 Parcelable
s,请在您的 Android 特定源代码(演示文稿?)中使用 @ParcelClass
注释来指示将 POJO 用作模型的 Parceler。
从 Parceler 生成的 Parcelable
输出中,您可以直接使用生成的 classes,或者通过 Parcels.wrap()
和 Parcels.unwrap()
实用程序 class并将数据序列化为 Bundle
.
O.K.,它现在正在工作。我终于意识到在 Android 应用程序中 运行 纯 java 模块是不可能的,你总是必须应用 android 库插件而不是 java插件:
apply plugin: 'com.android.library'
我还必须添加一个 Manifest.xml 并将以下内容添加到 java 模块的 build.gradle 中:
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
minSdkVersion 16
targetSdkVersion 21
}
}