【发布时间】:2020-05-26 03:15:10
【问题描述】:
我已经使用工作管理器将图像上传到火力基地。 我正在将交互报告类转换为 JsonString 并将其作为参数发送给工作管理器,以便我可以将其反序列化回原始对象并使用图像详细信息中的 url,否则我将不得不发送每个 url。 但在某些情况下它会抛出异常:
不能发送超过 1024 字节的数据
还有其他方法吗?
【问题讨论】:
我已经使用工作管理器将图像上传到火力基地。 我正在将交互报告类转换为 JsonString 并将其作为参数发送给工作管理器,以便我可以将其反序列化回原始对象并使用图像详细信息中的 url,否则我将不得不发送每个 url。 但在某些情况下它会抛出异常:
不能发送超过 1024 字节的数据
还有其他方法吗?
【问题讨论】:
你不能。这是 WorkManager 的 Data 类的记录限制。请参阅https://developer.android.com/reference/androidx/work/Data,其中列出了:
“这是一个轻量级容器,不应将其视为您的数据存储。因此,有效负载的序列化(字节数组)大小有一个强制的 MAX_DATA_BYTES 限制。如果您尝试序列化,此类将抛出 IllegalStateExceptions或反序列化超过此限制。”
【讨论】:
您不能,但也许此解决方案在某些情况下可以通过压缩和解压缩数据来帮助您。
尝试压缩并放入Data.Builder()
@Throws(IOException::class)
fun compress(str: String?): String? {
if (str == null || str.length == 0) {
return str
}
println("String length : " + str.length)
val out = ByteArrayOutputStream()
val gzip = GZIPOutputStream(out)
gzip.write(str.toByteArray())
gzip.close()
val outStr = Base64.encodeToString(out.toByteArray(), Base64.DEFAULT)
println("Output String lenght : " + outStr.length)
println("Output : $outStr")
return outStr
}
在Worker类中解压
@Throws(IOException::class)
fun decompress(str: String?): String? {
if (str == null || str.length == 0) {
return str
}
println("Input String length : " + str.length)
val gis = GZIPInputStream(ByteArrayInputStream(Base64.decode(str, Base64.DEFAULT)))
val outStr = ""
val out = ByteArrayOutputStream()
val buffer = ByteArray(256)
var n: Int
while (gis.read(buffer).also { n = it } >= 0) {
out.write(buffer, 0, n)
}
println("Output String lenght : " + outStr.length)
return String(out.toByteArray())
}
【讨论】: