Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e6cd56f

Browse files
committed
Replaces RenderingAsyncTask with RenderingHandler
AsyncTask prevents Espresso UI tests from proceeding. Using a Handler is more natural way of handling tasks on Android.
1 parent 997cdf3 commit e6cd56f

File tree

3 files changed

+44
-97
lines changed

3 files changed

+44
-97
lines changed

android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/PDFView.java

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import android.graphics.drawable.Drawable;
2828
import android.net.Uri;
2929
import android.os.AsyncTask;
30+
import android.os.HandlerThread;
3031
import android.util.AttributeSet;
3132
import android.util.Log;
3233
import android.widget.RelativeLayout;
@@ -51,7 +52,6 @@
5152
import com.shockwave.pdfium.PdfiumCore;
5253

5354
import java.io.File;
54-
import java.io.IOException;
5555
import java.io.InputStream;
5656
import java.util.ArrayList;
5757
import java.util.List;
@@ -190,9 +190,13 @@ enum ScrollDir {
190190
private DecodingAsyncTask decodingAsyncTask;
191191

192192
/**
193-
* Async task always playing in the background and proceeding rendering tasks
193+
* The thread {@link #renderingHandler} will run on
194194
*/
195-
RenderingAsyncTask renderingAsyncTask;
195+
private final HandlerThread renderingHandlerThread;
196+
/**
197+
* Handler always waiting in the background and rendering tasks
198+
*/
199+
RenderingHandler renderingHandler;
196200

197201
private PagesLoader pagesLoader;
198202

@@ -268,6 +272,8 @@ ScrollHandle getScrollHandle() {
268272
public PDFView(Context context, AttributeSet set) {
269273
super(context, set);
270274

275+
renderingHandlerThread = new HandlerThread("PDF renderer");
276+
271277
if (isInEditMode()) {
272278
return;
273279
}
@@ -445,8 +451,8 @@ public void recycle() {
445451
animationManager.stopAll();
446452

447453
// Stop tasks
448-
if (renderingAsyncTask != null) {
449-
renderingAsyncTask.cancel(true);
454+
if (renderingHandler != null) {
455+
renderingHandler.removeMessages(RenderingHandler.MSG_RENDER_TASK);
450456
}
451457
if (decodingAsyncTask != null) {
452458
decodingAsyncTask.cancel(true);
@@ -649,7 +655,7 @@ public void loadPages() {
649655
}
650656

651657
// Cancel all current tasks
652-
renderingAsyncTask.removeAllTasks();
658+
renderingHandler.removeMessages(RenderingHandler.MSG_RENDER_TASK);
653659
cacheManager.makeANewSet();
654660

655661
pagesLoader.loadPages();
@@ -677,8 +683,10 @@ public void loadComplete(PdfDocument pdfDocument) {
677683

678684
pagesLoader = new PagesLoader(this);
679685

680-
renderingAsyncTask = new RenderingAsyncTask(this, pdfiumCore, pdfDocument);
681-
renderingAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
686+
if (!renderingHandlerThread.isAlive()) {
687+
renderingHandlerThread.start();
688+
}
689+
renderingHandler = new RenderingHandler(this, pdfiumCore, pdfDocument);
682690

683691
if (scrollHandle != null) {
684692
scrollHandle.setupLayout(this);

android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/PagesLoader.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ private Holder getPageAndCoordsByOffset(float offset) {
8787
private void loadThumbnail(int userPage, int documentPage) {
8888
if (!pdfView.cacheManager.containsThumbnail(userPage, documentPage,
8989
thumbnailWidth, thumbnailHeight, thumbnailRect)) {
90-
pdfView.renderingAsyncTask.addRenderingTask(userPage, documentPage,
90+
pdfView.renderingHandler.addRenderingTask(userPage, documentPage,
9191
thumbnailWidth, thumbnailHeight, thumbnailRect,
9292
true, 0, pdfView.isBestQuality(), pdfView.isAnnotationRendering());
9393
}
@@ -218,7 +218,7 @@ private boolean loadCell(int userPage, int documentPage, int row, int col, float
218218

219219
if (renderWidth > 0 && renderHeight > 0) {
220220
if (!pdfView.cacheManager.upPartIfContained(userPage, documentPage, renderWidth, renderHeight, pageRelativeBounds, cacheOrder)) {
221-
pdfView.renderingAsyncTask.addRenderingTask(userPage, documentPage,
221+
pdfView.renderingHandler.addRenderingTask(userPage, documentPage,
222222
renderWidth, renderHeight, pageRelativeBounds, false, cacheOrder,
223223
pdfView.isBestQuality(), pdfView.isAnnotationRendering());
224224
}
@@ -255,4 +255,4 @@ public void loadPages() {
255255
}
256256
}
257257
}
258-
}
258+
}
Lines changed: 25 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -19,95 +19,55 @@
1919
import android.graphics.Matrix;
2020
import android.graphics.Rect;
2121
import android.graphics.RectF;
22-
import android.os.AsyncTask;
22+
import android.os.Handler;
23+
import android.os.Message;
2324

2425
import com.github.barteksc.pdfviewer.model.PagePart;
2526
import com.shockwave.pdfium.PdfDocument;
2627
import com.shockwave.pdfium.PdfiumCore;
2728

28-
import java.util.ArrayList;
29-
import java.util.Collections;
3029
import java.util.HashSet;
31-
import java.util.List;
3230
import 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

Comments
 (0)