Я реализую пользовательскую печать документов с помощью платформы печати Android.
Использую ссылку на документацию Android в качестве ссылки: https://developer.android.com/training/ ... ustom-docs
Я использую процесс PrintManager для отображения средства выбора печати, реализацию PrintDocumentAdapter, затем создание PDF-файла внутри onWrite() с использованием PrintedPdfDocument путем вызова startPage() и рисования содержимого. Canvas, вызов FinishPage() и, наконец, запись документа в ParcelFileDescriptor, переданный платформой.
В документации Android указано, что если работа внутри onWrite() не может быть завершена быстро, она может быть выполнена в рабочем потоке. Однако PrintedPdfDocument (и базовый PdfDocument) не является потокобезопасным и позволяет одновременно открывать только одну страницу. Это становится проблематичным в многопоточном приложении, где рендеринг страниц требует больших затрат и состоит из вычислений макета, генерации растровых изображений, формирования текста и других ресурсоемких операций, которые в идеале должны выполняться параллельно.
В моем приложении несколько фоновых задач генерируют данные, необходимые для рисования каждой страницы, но каждая страница по-прежнему требует обязательных вызовов startPage() и FinishPage(), оба из которых работают с объектом, не поддерживающим потокобезопасность. Из-за этого неясно, как правильно интегрировать логику параллельного рендеринга с однопоточным требованием PrintedPdfDocument.
Какова правильная модель потоков для использования Android Print Framework в этой ситуации? Как задачи фонового рендеринга должны безопасно взаимодействовать с onWrite(), если само создание PDF-файлов должно оставаться последовательным?
Подробнее здесь: https://stackoverflow.com/questions/798 ... pdfdocumen