【问题标题】:how to pass object as input to WorkManager without Serialization?如何在没有序列化的情况下将对象作为输入传递给 WorkManager?
【发布时间】:2019-04-27 02:48:06
【问题描述】:

我需要将复杂对象传递给 WorkManager。或者我需要序列化包含 Livedata 和 Date 的对象。

抛出 java.lang.IllegalArgumentException: Key CabinId2 has invalid type class com.example.sonyadmin.data.Task

     val data = workDataOf("cabinId2" to task)
     val uploadWorkRequest = OneTimeWorkRequestBuilder<WManager>()
         .setInputData(data)
         .build()

【问题讨论】:

    标签: android-workmanager


    【解决方案1】:

    WorkManager 的 Data 类仅接受某些特定类型作为值,如参考文档中所述:

    一组可持久的键/值对,用作 ListenableWorkers 的输入和输出。键是字符串,值可以是字符串、原始类型或它们的数组变体。

    除此之外,还有大约 10KB 的大小限制,由常量 MAX_DATA_BYTES 指定。
    如果数据不是太大,您可能希望将其序列化为字符串并将其用作 WorkRequest 中的 inputData。另一种方法是将对象的引用放在 inputData 中。 WorkManager's codelab 有一个示例,其中图像的 URI 被传递到 WorkRequest 并且图像位于文件系统上。

    【讨论】:

    • 谢谢。但是,如何发送 Uris 列表? reference 在这里使用不是一个令人困惑的词。不要发送参考,因为当操作系统稍后再次启动工作时,这些参考可能不可用。 Uri 是唯一可用的引用类型,因此更清楚地说是 Uri。
    • 令人讨厌的是,Data 的这种限制并没有在代码中强制执行:即workDataOf 接受了Pair&lt;String, Any?&gt;,这可能是人们首先提出OP 问题的原因:有一种方法把数据放进去,但一旦工作开始,就没有办法把它拿出来。
    猜你喜欢
    • 1970-01-01
    • 2014-08-04
    • 2015-02-06
    • 1970-01-01
    • 2012-02-19
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    相关资源
    最近更新 更多