19
19
import android .graphics .Matrix ;
20
20
import android .graphics .Rect ;
21
21
import android .graphics .RectF ;
22
- import android .os .AsyncTask ;
22
+ import android .os .Handler ;
23
+ import android .os .Message ;
23
24
24
25
import com .github .barteksc .pdfviewer .model .PagePart ;
25
26
import com .shockwave .pdfium .PdfDocument ;
26
27
import com .shockwave .pdfium .PdfiumCore ;
27
28
28
- import java .util .ArrayList ;
29
- import java .util .Collections ;
30
29
import java .util .HashSet ;
31
- import java .util .List ;
32
30
import java .util .Set ;
33
31
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 ;
35
42
36
43
private PdfiumCore pdfiumCore ;
37
44
private PdfDocument pdfDocument ;
38
45
39
- private final List <RenderingTask > renderingTasks ;
40
46
private PDFView pdfView ;
41
47
42
48
private RectF renderBounds = new RectF ();
43
49
private Rect roundedRenderBounds = new Rect ();
44
50
private Matrix renderMatrix = new Matrix ();
45
51
private final Set <Integer > openedPages = new HashSet <>();
46
52
47
- public RenderingAsyncTask (PDFView pdfView , PdfiumCore pdfiumCore , PdfDocument pdfDocument ) {
53
+ RenderingHandler (PDFView pdfView , PdfiumCore pdfiumCore , PdfDocument pdfDocument ) {
48
54
this .pdfView = pdfView ;
49
55
this .pdfiumCore = pdfiumCore ;
50
56
this .pdfDocument = pdfDocument ;
51
- this .renderingTasks = Collections .synchronizedList (new ArrayList <RenderingTask >());
52
-
53
57
}
54
58
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 ) {
56
60
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 );
59
63
}
60
64
61
65
@ 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 );
111
71
}
112
72
}
113
73
@@ -121,15 +81,9 @@ private PagePart proceed(RenderingTask renderingTask) {
121
81
int h = Math .round (renderingTask .height );
122
82
Bitmap render = Bitmap .createBitmap (w , h , Bitmap .Config .ARGB_8888 );
123
83
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 );
133
87
134
88
if (!renderingTask .bestQuality ) {
135
89
Bitmap cpy = render .copy (Bitmap .Config .RGB_565 , false );
@@ -153,18 +107,6 @@ private void calculateBounds(int width, int height, RectF pageSliceBounds) {
153
107
renderBounds .round (roundedRenderBounds );
154
108
}
155
109
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
-
168
110
private class RenderingTask {
169
111
170
112
float width , height ;
@@ -183,8 +125,7 @@ private class RenderingTask {
183
125
184
126
boolean annotationRendering ;
185
127
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 ) {
188
129
this .page = page ;
189
130
this .width = width ;
190
131
this .height = height ;
@@ -195,7 +136,5 @@ public RenderingTask(float width, float height, RectF bounds, int userPage, int
195
136
this .bestQuality = bestQuality ;
196
137
this .annotationRendering = annotationRendering ;
197
138
}
198
-
199
139
}
200
-
201
140
}
0 commit comments