1919import android .graphics .Matrix ;
2020import android .graphics .Rect ;
2121import android .graphics .RectF ;
22- import android .os .AsyncTask ;
22+ import android .os .Handler ;
23+ import android .os .Message ;
2324
2425import com .github .barteksc .pdfviewer .model .PagePart ;
2526import com .shockwave .pdfium .PdfDocument ;
2627import com .shockwave .pdfium .PdfiumCore ;
2728
28- import java .util .ArrayList ;
29- import java .util .Collections ;
3029import java .util .HashSet ;
31- import java .util .List ;
3230import java .util .Set ;
3331
34- class RenderingAsyncTask extends AsyncTask <Void , PagePart , Void > {
32+ /**
33+ * A {@link Handler} that will process incoming {@link RenderingTask} messages
34+ * and alert {@link PDFView#onBitmapRendered(PagePart)} when the portion of the
35+ * PDF is ready to render.
36+ */
37+ class RenderingHandler extends Handler {
38+ /**
39+ * {@link Message#what} kind of message this handler processes.
40+ */
41+ static final int MSG_RENDER_TASK = 1 ;
3542
3643 private PdfiumCore pdfiumCore ;
3744 private PdfDocument pdfDocument ;
3845
39- private final List <RenderingTask > renderingTasks ;
4046 private PDFView pdfView ;
4147
4248 private RectF renderBounds = new RectF ();
4349 private Rect roundedRenderBounds = new Rect ();
4450 private Matrix renderMatrix = new Matrix ();
4551 private final Set <Integer > openedPages = new HashSet <>();
4652
47- public RenderingAsyncTask (PDFView pdfView , PdfiumCore pdfiumCore , PdfDocument pdfDocument ) {
53+ RenderingHandler (PDFView pdfView , PdfiumCore pdfiumCore , PdfDocument pdfDocument ) {
4854 this .pdfView = pdfView ;
4955 this .pdfiumCore = pdfiumCore ;
5056 this .pdfDocument = pdfDocument ;
51- this .renderingTasks = Collections .synchronizedList (new ArrayList <RenderingTask >());
52-
5357 }
5458
55- public void addRenderingTask (int userPage , int page , float width , float height , RectF bounds , boolean thumbnail , int cacheOrder , boolean bestQuality , boolean annotationRendering ) {
59+ void addRenderingTask (int userPage , int page , float width , float height , RectF bounds , boolean thumbnail , int cacheOrder , boolean bestQuality , boolean annotationRendering ) {
5660 RenderingTask task = new RenderingTask (width , height , bounds , userPage , page , thumbnail , cacheOrder , bestQuality , annotationRendering );
57- renderingTasks . add ( task );
58- wakeUp ( );
61+ Message msg = obtainMessage ( MSG_RENDER_TASK , task );
62+ sendMessage ( msg );
5963 }
6064
6165 @ Override
62- protected Void doInBackground (Void ... params ) {
63- while (!isCancelled ()) {
64-
65- // Proceed all tasks
66- while (true ) {
67- RenderingTask task ;
68- synchronized (renderingTasks ) {
69- if (!renderingTasks .isEmpty ()) {
70- task = renderingTasks .get (0 );
71- } else {
72- break ;
73- }
74- }
75- //it is very rare case, but sometimes null can appear
76- if (task != null ) {
77- PagePart part = proceed (task );
78- if (part == null ) {
79- break ;
80- } else if (renderingTasks .remove (task )) {
81- publishProgress (part );
82- } else {
83- part .getRenderedBitmap ().recycle ();
84- }
85- }
86- }
87-
88- // Wait for new task, return if canceled
89- if (!waitForRenderingTasks () || isCancelled ()) {
90- return null ;
91- }
92-
93- }
94- return null ;
95-
96- }
97-
98- @ Override
99- protected void onProgressUpdate (PagePart ... part ) {
100- pdfView .onBitmapRendered (part [0 ]);
101- }
102-
103- private boolean waitForRenderingTasks () {
104- try {
105- synchronized (renderingTasks ) {
106- renderingTasks .wait ();
107- }
108- return true ;
109- } catch (InterruptedException e ) {
110- return false ;
66+ public void handleMessage (Message message ) {
67+ RenderingTask task = (RenderingTask ) message .obj ;
68+ PagePart part = proceed (task );
69+ if (part != null ) {
70+ pdfView .onBitmapRendered (part );
11171 }
11272 }
11373
@@ -121,15 +81,9 @@ private PagePart proceed(RenderingTask renderingTask) {
12181 int h = Math .round (renderingTask .height );
12282 Bitmap render = Bitmap .createBitmap (w , h , Bitmap .Config .ARGB_8888 );
12383 calculateBounds (w , h , renderingTask .bounds );
124-
125- if (!isCancelled ()) {
126- pdfiumCore .renderPageBitmap (pdfDocument , render , renderingTask .page ,
127- roundedRenderBounds .left , roundedRenderBounds .top ,
128- roundedRenderBounds .width (), roundedRenderBounds .height (), renderingTask .annotationRendering );
129- } else {
130- render .recycle ();
131- return null ;
132- }
84+ pdfiumCore .renderPageBitmap (pdfDocument , render , renderingTask .page ,
85+ roundedRenderBounds .left , roundedRenderBounds .top ,
86+ roundedRenderBounds .width (), roundedRenderBounds .height (), renderingTask .annotationRendering );
13387
13488 if (!renderingTask .bestQuality ) {
13589 Bitmap cpy = render .copy (Bitmap .Config .RGB_565 , false );
@@ -153,18 +107,6 @@ private void calculateBounds(int width, int height, RectF pageSliceBounds) {
153107 renderBounds .round (roundedRenderBounds );
154108 }
155109
156- public void removeAllTasks () {
157- synchronized (renderingTasks ) {
158- renderingTasks .clear ();
159- }
160- }
161-
162- public void wakeUp () {
163- synchronized (renderingTasks ) {
164- renderingTasks .notify ();
165- }
166- }
167-
168110 private class RenderingTask {
169111
170112 float width , height ;
@@ -183,8 +125,7 @@ private class RenderingTask {
183125
184126 boolean annotationRendering ;
185127
186- public RenderingTask (float width , float height , RectF bounds , int userPage , int page , boolean thumbnail , int cacheOrder , boolean bestQuality , boolean annotationRendering ) {
187- super ();
128+ RenderingTask (float width , float height , RectF bounds , int userPage , int page , boolean thumbnail , int cacheOrder , boolean bestQuality , boolean annotationRendering ) {
188129 this .page = page ;
189130 this .width = width ;
190131 this .height = height ;
@@ -195,7 +136,5 @@ public RenderingTask(float width, float height, RectF bounds, int userPage, int
195136 this .bestQuality = bestQuality ;
196137 this .annotationRendering = annotationRendering ;
197138 }
198-
199139 }
200-
201140}
0 commit comments