Передача рисования / раскрашивания / сохранение нескольких растровых изображений

#android #android-fragments #bitmap #android-asynctask

#Android #android-фрагменты #растровое изображение #android-asynctask

Вопрос:

Цель:

Я хочу рисовать / писать / раскрашивать растровые изображения из pdf и сохранять их вместе, чтобы я мог отправлять их по электронной почте.

Подробные сведения:

У меня есть несколько Pdf файлов, содержащих 5-20 страницы в каждом, прямо сейчас я извлекаю растровые изображения из pdfs и загружаю их фрагментами в ViewPager , где я могу прокручивать их и писать / рисовать или что я хочу. Чтобы сохранить / восстановить текущее состояние растрового изображения, которое я использую onSaveInstanceState . Таким образом, я могу получить последнюю стадию растрового изображения, проводя пальцем взад и вперед.

Что-то вроде этого:

 @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putParcelable("Bitmap", bitmap);
    }
  

Проблема:

Пользователь нажимает кнопку отправки электронной почты, и я должен иметь возможность сохранять все изображения независимо от того, на какой странице он находится, т. Е. Он отредактировал страницу с 5 по 10, и теперь он находится на странице 10 и нажимает кнопку отправки, я должен иметь возможность извлекать все отредактированные изображения.

Проблема 2:

Как я уже говорил, количество изображений составляет около 5-20, сохранение состояния в onSaveInstanceState отлично работает, но оно продолжает увеличивать объем памяти приложения в ОЗУ, и приложение вылетает на 10-м изображении, к которому относится размер приложения 150Mbs .

Но сохранение изображения в виде пакета в onSaveInstanceState также необходимо, потому что это помогает ускорить загрузку изображений, когда пользователь проводит пальцем взад и вперед.

Итак, я подумал, можем ли мы каким-либо образом создать пользовательский класс bundle, в котором мы можем записать изображение на диск, скажем, после прокрутки 5 страниц, и очистить память и прочитать его обратно с диска в память, когда пользователь прокручивает назад? звучит ли это разумно?

Что я пробовал:

Поскольку растровые изображения загружаются отдельными фрагментами, я попытался сохранить растровые изображения во внешнее хранилище в OnDestroy , но поскольку сохранение растровых изображений на диск — непростая задача, это требует времени, хотя я использую AsyncTask , но когда пользователь быстро перемещается между фрагментами, сохранение растровых изображений в OnDestroy не кажется удобным способом.

Вот почему я задаю вопрос, так что, возможно, вы лучше понимаете ситуацию и можете помочь мне добиться этого более удобным способом.

Итак, какова ваша цель, как я могу справиться с этой ситуацией?

Примечание:

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

Спасибо

Комментарии:

1. У меня к вам следующие вопросы. 1. уменьшаете ли вы масштаб изображений и отображаете ли их на viewpager в соответствии с шириной / высотой макета. если нет, вам нужно это сделать (что уменьшит потребление памяти растровых изображений).

2. 2. Допустим, у вас есть холст над каждым изображением, пользователь рисует что-то поверх него, затем сохраняет изменения в изображении, когда пользователь проводит пальцем по следующему. (Эта практика увеличит размер изображения).

Ответ №1:

Позвольте мне описать, как я вижу решение этой проблемы сейчас.

Должен быть, Service который принимает отредактированное растровое изображение с некоторым идентификатором (одинаковым для всех модификаций исходного растрового изображения), добавляет его в очередь, а затем каждый элемент этой очереди сохраняется во внешнем хранилище. Он имеет ограниченный Executor экземпляр, который выполняет эти задачи (они могут быть просто Runnable ) и Service создает, HashMap где сопоставляет Future задачу с идентификатором растрового изображения. Поэтому, когда Bitmap появилось новое, Service проверяет карту и заменяет ожидающую задачу (с тем же исходным растровым изображением), если таковая существовала.

Вы можете отправить задачу этому Service из destroyItem перехватчика FragmentStatePagerAdapter .

Итак, когда пользователь нажимает на кнопку сохранения, вы также должны отправить все отредактированные растровые изображения, оставленные этому Service , и просто дождаться завершения.

Комментарии:

1. Я тоже думаю о том же, что вы думаете о Tap ?

2. @MaxRockwood выглядит хорошо, как плоская оболочка сервиса Android, square почти всегда создает хорошую мысль. Но я раньше этим не пользовался

3. да, система очередей кажется многообещающей в отношении сложившейся у меня ситуации, я попробую и опубликую обновление.