使用WorkManager上载大位图

问题描述 投票:0回答:1

我正在尝试使用WorkManager将位图上载到服务器。基本上,用户拍照并按下按钮将其上传到服务器。

但是,当我尝试使用Work Manager的Data.Builder类来序列化位图时,就会出现问题,该类的限制为10240字节。因此,如果我执行以下操作:

val data = Data.Builder()
//Add parameter in Data class. just like bundle. You can also add Boolean and Number in parameter.
data.putString(IMAGE_NAME, identifier)
data.putByteArray(BITMAP_ARRAY, imageBytes) 

将抛出以下崩溃java.lang.IllegalStateException: Data cannot occupy more than 10240 bytes when serialized

在启动工作管理器之前,我总是可以将照片保存到文件中,然后在工作管理器中读取文件。但是,如果可能的话,我会避免所有文件管理,因为用户可以始终关闭应用程序,等等。

如果服务器成功响应,我只是想保存文件。

还有其他方法可以实现这一目标吗?是否有谷歌针对此类事情的“建议”?

这是我的[WorkManager功能的doWork()

    override fun doWork(): Result {
        val identifier = inputData.getString(IMAGE_NAME)!!
        val imageBytes = inputData.getByteArray(BITMAP_ARRAY)!!

        val result = executeRequest(identifier, imageBytes)

        return if (result.isSuccess()) {
            //saving image
            val bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.size)
            saveToInternalStorage(context, identifier, bitmap)
            Result.success()
        } else {
            Result.failure()
        }
    }
android kotlin android-workmanager
1个回答
2
投票

如果可能,我会避免所有文件管理,因为用户可以始终关闭应用程序,等等。>>

然后您不应该使用WorkManager。 documentation明确指出:

WorkManager不适用于正在进行的后台工作,如果应用程序进程消失,可以安全地终止该后台工作

关于将大量数据放入Datadocumentation也很清楚:

数据对象的最大大小限制为10KB。 [...]如果您需要传入和传出更多数据,则应将数据放在其他位置

因此,如果您最终想使用WorkManager(这对我来说是个好主意),则必须将大位图放入文件中,将该文件的URI放入Data对象中,然后在您的doWork()中从该文件上传位图,然后删除该文件。

[如果您在doWork()的中间杀死应用程序,则WorkManager框架将稍后(不增加用户界面)(增加退避时间)开始您的应用程序流程,并尝试再次进行上传。

© www.soinside.com 2019 - 2024. All rights reserved.