Загрузка больших растровых изображений с помощью WorkManager - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь использовать WorkManager для загрузки растрового изображения на сервер. Обычно пользователь делает снимок и нажимает кнопку, чтобы загрузить его на сервер.

Однако проблема возникает, когда я пытаюсь сериализовать растровое изображение с помощью класса Work.Builder Work Manager, который имеет ограничение в 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

Я всегда могу сохранить фотографию в файл перед запуском менеджера работ и в работеменеджер прочитал файл. Однако я бы по возможности избегал всякого управления файлами, потому что пользователь всегда мог закрыть приложение и т. Д.

Я просто хотел сохранить файл, если сервер ответил успешно.

IsЕсть ли другой способ добиться этого? Есть ли в Google "предложение" для такого рода вещей?

Вот мой 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()
        }
    }

1 Ответ

2 голосов
/ 18 октября 2019

Я бы по возможности избегал управления файлами, потому что пользователь всегда мог закрыть приложение и т. Д.

Тогда вам не следует использовать WorkManager. В документации это ясно сказано:

WorkManager не предназначен для фоновой работы в процессе, которую можно безопасно завершить, если процесс приложения завершится

Что касается размещения большого количества данных в Data, документация также ясна:

Для объектов данных существует ограничение максимального размера 10 КБ,[...] Если вам нужно передать больше данных в и из вашего Worker, вы должны поместить свои данные в другое место

Так что если вы все-таки хотите использовать WorkManager для этого (что звучит какхорошая идея для меня), вы должны поместить большое растровое изображение в файл, поместить URI этого файла в объект Data, а затем в doWork() загрузить растровое изображение из этого файла и затем удалить файл.

Если вы убьете свое приложение в середине doWork(), фреймворк WorkManager запустит процесс вашего приложения (без пользовательского интерфейса) позже (с увеличением времени отката) и попытается повторить загрузку. 1028 *

...