【问题标题】:Uploading large bitmaps using WorkManager使用 WorkManager 上传大型位图
【发布时间】:2019-10-18 18:25:01
【问题描述】:

我正在尝试使用 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

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

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

还有其他方法可以实现吗?这类事情有谷歌“建议”吗?

这是我的 doWork() WorkManager 功能

    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】:

    如果可能的话,我宁愿避免所有文件管理,因为用户可以随时关闭应用程序等。

    那么您不应该使用 WorkManager。 documentation 清楚地说明了这一点:

    WorkManager 不适用于在应用进程消失时可以安全终止的进程内后台工作

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

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

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

    如果您在 doWork() 中间终止您的应用,WorkManager 框架将在稍后(随着退避时间增加)启动您的应用进程(没有 UI)并尝试再次上传。

    【讨论】:

    • 如果应用程序无法或已关闭,将其保存在文件中以便稍后发送是有意义的。但是文件管理在这种情况下总是存在的,例如强制关闭,对吧?我的意思是,我必须检查每个应用程序启动,如果临时文件已经存在并且工作没有安排,对吗?
    • 使用例如为每个作业创建一个唯一的文件名UUID.randomUUID().toString()。然后仅在文件上传和删除后从doWork() 返回Result.success()。然后你不需要在应用启动期间检查是否有任何文件需要上传,因为 WorkManager 保证。
    【解决方案2】:

    我将图像保存到文件系统中,然后在我的数据对象中传递文件路径。在我的工人类中,我通过使用创建数据对象时传递的文件路径检索图像来上传图像

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 2019-12-02
      • 2020-01-21
      • 1970-01-01
      • 2018-04-11
      相关资源
      最近更新 更多