Я пишу редактор растровых изображений, в котором я использую шаблон команд для представления действий, которые преобразуют документ. Я сохраняю все команды, выполненные до сих пор, в списке и, чтобы реализовать отмену, я возвращаю документ в его первоначальное состояние и затем воспроизводю все, кроме последней команды.
Я бы хотел, чтобы в моей системе отмены / повтора была предусмотрена следующая функция: когда пользователь закрывает редактор и возвращает его, документ , включая доступные команды отмены и повтора , должен быть восстановлен до его состояния. был, когда пользователь ушел.
Я реализую это для Android, где вашему приложению может быть уделено очень мало внимания, прежде чем оно будет удалено из памяти, например, если пользователь получает телефонный звонок. Кроме того, некоторые из моих команд, например, список всех координат x, y, нарисованных пользователем, так что это может занять несколько минут для сохранения на диск.
Моя текущая идея заключается в следующем:
- Когда выполняется новое действие, объект команды добавляется в список S для команд, которые необходимо сохранить на диск.
- Используется фоновый поток, который будет постоянно принимать команды из списка S и сохранять их на диск. Постфикс используемых имен файлов будет пронумерован по порядку. Например, если пользователь заполнил экран, затем нарисовал 2 круга, командные файлы могут называться FillCommand1.cmd, DrawCircleCommand2.cmd, DrawCircleCommand3.cmd.
- Периодически мы сохраняем команду «checkpoint», целью которой является сохранение полного состояния документа, чтобы, даже если один из файлов .cmd был поврежден, мы могли восстановить последнюю версию документа.
- Когда пользователь выходит из приложения, фоновый поток пытается завершить сохранение всех команд, которые он может (но он может быть убит).
- При запуске мы ищем самый последний файл .cmd, представляющий контрольную точку, которую мы можем успешно загрузить. Все файлы .cmd, которые мы можем загрузить после этого (то есть некоторые файлы могут быть повреждены), попадают в список команд повтора, все файлы .cmd, которые мы можем загрузить между первой загруженной контрольной точкой и самой старой контрольной точкой, которую мы можем загрузить, входят в список отмен .
Я хочу, чтобы предел отмены составлял около 20 или 30 команд назад, поэтому мне нужна дополнительная логика для отбрасывания команд, удаления файлов .cmd, и мне нужно беспокоиться о многопоточности. Эта система кажется довольно сложной и потребует много испытаний, чтобы убедиться, что она не ошибается.
Есть ли что-нибудь в Java или Android, что может помочь сделать это проще? Я заново изобретаю колесо? Может быть, база данных будет лучше?