#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. да, система очередей кажется многообещающей в отношении сложившейся у меня ситуации, я попробую и опубликую обновление.