Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用WorkManager上载大型位图_Android_Kotlin_Android Workmanager - Fatal编程技术网

Android 使用WorkManager上载大型位图

Android 使用WorkManager上载大型位图,android,kotlin,android-workmanager,Android,Kotlin,Android Workmanager,我正在尝试使用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 paramete

我正在尝试使用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:序列化时数据不能占用超过10240字节

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

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

有没有其他方法可以做到这一点?谷歌对这类事情有什么“建议”吗

这是我的WorkManager功能的
doWork()

override fun doWork():结果{
val标识符=inputData.getString(图像名称)!!
val imageBytes=inputData.getByteArray(位图数组)!!
val结果=executeRequest(标识符,imageBytes)
返回if(result.issucess()){
//保存图像
val bitmap=BitmapFactory.decodeByteArray(imageBytes,0,imageBytes.size)
saveToInternalStorage(上下文、标识符、位图)
结果:成功()
}否则{
结果.失败()
}
}
如果可能的话,我会尽量避免所有的文件管理,因为用户总是可以关闭应用程序,等等

那么您不应该使用WorkManager。缔约国明确指出:

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

关于将大量数据放入
数据中
,这一点也很清楚:

数据对象的最大大小限制为10KB。[…]如果您需要向员工传递更多数据,您应该将数据放在其他地方

因此,如果你想使用WorkManager来实现这一点(对我来说这听起来是个好主意),你必须将大位图放在一个文件中,将该文件的URI放在
数据
对象中,然后放在
doWork()
中从该文件上载位图,然后删除该文件


如果你在“代码> DOWORK())/>代码中杀死你的应用程序, WorkMasks/Cuff>框架将稍后启动你的应用程序进程(没有UI)(并且随着退避时间的增加)并尝试再次上传。

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

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