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

Skip to content

Commit c591719

Browse files
committed
Merge branch 'cesquivias-master'
2 parents 40000ac + 8576474 commit c591719

File tree

4 files changed

+58
-97
lines changed

4 files changed

+58
-97
lines changed

README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@ pdfView.fromUri(Uri)
5252
or
5353
pdfView.fromFile(File)
5454
or
55+
pdfView.fromBytes(byte[])
56+
or
57+
pdfView.fromStream(InputStream)
58+
or
59+
pdfView.fromSource(DocumentSource)
60+
or
5561
pdfView.fromAsset(String)
5662
.pages(0, 2, 1, 3, 3, 3) // all pages are displayed by default
5763
.enableSwipe(true)
@@ -91,7 +97,7 @@ You can also create custom scroll handles, just implement **ScrollHandle** inter
9197
All methods are documented as Javadoc comments on interface [source](https://github.com/barteksc/AndroidPdfViewer/tree/master/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/scroll/ScrollHandle.java).
9298

9399
## Document sources
94-
Version 1.5.0 introduced _document sources_, which are just providers for PDF documents.
100+
Version 2.3.0 introduced _document sources_, which are just providers for PDF documents.
95101
Every provider implements **DocumentSource** interface.
96102
Predefined providers are available in **com.github.barteksc.pdfviewer.source** package and can be used as
97103
samples for creating custom ones.

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

Lines changed: 17 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,11 @@ 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(renderingHandlerThread.getLooper(),
690+
this, pdfiumCore, pdfDocument);
682691

683692
if (scrollHandle != null) {
684693
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: 31 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -19,95 +19,62 @@
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.Looper;
24+
import android.os.Message;
2325

2426
import com.github.barteksc.pdfviewer.model.PagePart;
2527
import com.shockwave.pdfium.PdfDocument;
2628
import com.shockwave.pdfium.PdfiumCore;
2729

28-
import java.util.ArrayList;
29-
import java.util.Collections;
3030
import java.util.HashSet;
31-
import java.util.List;
3231
import java.util.Set;
3332

34-
class RenderingAsyncTask extends AsyncTask<Void, PagePart, Void> {
33+
/**
34+
* A {@link Handler} that will process incoming {@link RenderingTask} messages
35+
* and alert {@link PDFView#onBitmapRendered(PagePart)} when the portion of the
36+
* PDF is ready to render.
37+
*/
38+
class RenderingHandler extends Handler {
39+
/**
40+
* {@link Message#what} kind of message this handler processes.
41+
*/
42+
static final int MSG_RENDER_TASK = 1;
3543

3644
private PdfiumCore pdfiumCore;
3745
private PdfDocument pdfDocument;
3846

39-
private final List<RenderingTask> renderingTasks;
4047
private PDFView pdfView;
4148

4249
private RectF renderBounds = new RectF();
4350
private Rect roundedRenderBounds = new Rect();
4451
private Matrix renderMatrix = new Matrix();
4552
private final Set<Integer> openedPages = new HashSet<>();
4653

47-
public RenderingAsyncTask(PDFView pdfView, PdfiumCore pdfiumCore, PdfDocument pdfDocument) {
54+
RenderingHandler(Looper looper, PDFView pdfView, PdfiumCore pdfiumCore, PdfDocument pdfDocument) {
55+
super(looper);
4856
this.pdfView = pdfView;
4957
this.pdfiumCore = pdfiumCore;
5058
this.pdfDocument = pdfDocument;
51-
this.renderingTasks = Collections.synchronizedList(new ArrayList<RenderingTask>());
52-
5359
}
5460

55-
public void addRenderingTask(int userPage, int page, float width, float height, RectF bounds, boolean thumbnail, int cacheOrder, boolean bestQuality, boolean annotationRendering) {
61+
void addRenderingTask(int userPage, int page, float width, float height, RectF bounds, boolean thumbnail, int cacheOrder, boolean bestQuality, boolean annotationRendering) {
5662
RenderingTask task = new RenderingTask(width, height, bounds, userPage, page, thumbnail, cacheOrder, bestQuality, annotationRendering);
57-
renderingTasks.add(task);
58-
wakeUp();
63+
Message msg = obtainMessage(MSG_RENDER_TASK, task);
64+
sendMessage(msg);
5965
}
6066

6167
@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-
}
68+
public void handleMessage(Message message) {
69+
RenderingTask task = (RenderingTask) message.obj;
70+
final PagePart part = proceed(task);
71+
if (part != null) {
72+
pdfView.post(new Runnable() {
73+
@Override
74+
public void run() {
75+
pdfView.onBitmapRendered(part);
7476
}
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;
77+
});
11178
}
11279
}
11380

@@ -121,15 +88,9 @@ private PagePart proceed(RenderingTask renderingTask) {
12188
int h = Math.round(renderingTask.height);
12289
Bitmap render = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
12390
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-
}
91+
pdfiumCore.renderPageBitmap(pdfDocument, render, renderingTask.page,
92+
roundedRenderBounds.left, roundedRenderBounds.top,
93+
roundedRenderBounds.width(), roundedRenderBounds.height(), renderingTask.annotationRendering);
13394

13495
if (!renderingTask.bestQuality) {
13596
Bitmap cpy = render.copy(Bitmap.Config.RGB_565, false);
@@ -153,18 +114,6 @@ private void calculateBounds(int width, int height, RectF pageSliceBounds) {
153114
renderBounds.round(roundedRenderBounds);
154115
}
155116

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-
168117
private class RenderingTask {
169118

170119
float width, height;
@@ -183,8 +132,7 @@ private class RenderingTask {
183132

184133
boolean annotationRendering;
185134

186-
public RenderingTask(float width, float height, RectF bounds, int userPage, int page, boolean thumbnail, int cacheOrder, boolean bestQuality, boolean annotationRendering) {
187-
super();
135+
RenderingTask(float width, float height, RectF bounds, int userPage, int page, boolean thumbnail, int cacheOrder, boolean bestQuality, boolean annotationRendering) {
188136
this.page = page;
189137
this.width = width;
190138
this.height = height;
@@ -195,7 +143,5 @@ public RenderingTask(float width, float height, RectF bounds, int userPage, int
195143
this.bestQuality = bestQuality;
196144
this.annotationRendering = annotationRendering;
197145
}
198-
199146
}
200-
201147
}

0 commit comments

Comments
 (0)