当你有一个包含大量变量(布尔值,整数,字符串)的大POJO,并且你想使用新的工作管理器来启动一个作业时,你可以创建一个数据文件,该文件被添加到一次性工作请求对象中。
构建这个数据文件的最佳实践是什么?(* 写100行代码只是说为每个变量在构建器上放置int是不对的。
答案
最后我把我的parcelable对象拆开了,因为我认为这是最好的实现。我不想使用gson lib,因为它会给我的对象增加另一层序列化。
Data.Builder builder = new Data.Builder();
builder.putBoolean(KEY_BOOL_1, stateObject.bool1);
builder.putBoolean(KEY_BOOL_2, stateObject.bool2);
builder.putBoolean(KEY_BOOL_3, stateObject.bool3);
builder.putInt(KEY_INT_1, stateObject.int1);
builder.putInt(KEY_INT_2, stateObject.int2);
builder.putString(KEY_STRING_1, stateObject.string1);
return builder.build();
更新
对我的问题的部分答案正如@CommonsWare所指出的:
- 不支持Parcelable的原因是数据是持久的。*
不知道数据不支持可打包的详细答案是什么?
- This answer解释其:
Data是一个轻量级的容器,它是一个简单的键值Map,只能保存原语& String的值沿着它们的String版本。它实际上是用于轻量级的中间数据传输。它不应该用于也不能保存Serializable或Parcelable对象。
请注意,序列化时数据的大小限制为10 KB。
6条答案
按热度按时间sdnqo3pr1#
使用GSON非常简单:https://stackoverflow.com/a/28392599/5931191
tkclm6bt2#
该解决方案不使用JSON,直接序列化为字节数组。
添加proguard规则
7tofc5zh3#
我在这里张贴我的解决方案,因为我认为它可能是有趣的其他人。请注意,这是我第一次尝试,我很清楚,我们可能会改进它,但这是一个很好的开始。
首先声明一个从Worker扩展而来的抽象类,如下所示:
WorkManagerDataExtender是一个具有数据扩展的接口。
getParameter()
是以下扩展之一:不幸的是,我无法使用inlined + reified的功能来避免所有的默认值逻辑。如果有人可以,请在评论中告诉我。
getClassA()
和getClassB()
也是同一接口上的扩展。下面是其中一个示例:(Then您可以在此扩展返回时调用
toWorkData()
,或者使其返回Data,但这样可以在调用toWorkData()
之前向Map添加更多键值对现在你要做的就是创建SingleParameterWorker的子类,然后创建Data的“to”和“from”扩展到你需要的任何类。在我的情况下,因为我有很多需要相同类型POJO的Workers,这似乎是一个很好的解决方案。
p3rjfoxz4#
接受的答案是正确的。但新的android开发人员不容易理解,所以这就是为什么我给了另一个答案与适当的解释。
我的需求是传递**
Bitmap
**对象。(可根据需求传递)在gradle文件中添加依赖项
等级:
使用以下方法序列化和反序列化对象
序列化对象。
传递到数据对象。
处理
Worker
类中的对象。现在,
Worker
类中的位图对象已经准备就绪。上面是一个例子,如何在worker类中传递对象。
btqmn9zl5#
在Kotlin中,我就是这样做的
Object到Json
要转换回模型,
3bygqnnd6#
首先,您需要知道数据的值保持器是private val mValues,您不能完全使用它来向数据添加可打包的内容,但是有一个变通方法可以使这个过程至少不那么繁琐