Android fragments 如何清除android PDFView中的java.lang.OutOfMemoryError?
朋友我已成功使用webview在我的应用程序中创建了pdfview。但有时,当我加载超过40页的pdf文件时,我会遇到崩溃,如果你们中的任何人能告诉我为什么我会收到这条消息,以及我必须做些什么来避免收到这条错误,这将是非常有帮助的。下面是我收到的logcat错误消息 Logcat错误:Android fragments 如何清除android PDFView中的java.lang.OutOfMemoryError?,android-fragments,bitmap,out-of-memory,pdfviewer,Android Fragments,Bitmap,Out Of Memory,Pdfviewer,朋友我已成功使用webview在我的应用程序中创建了pdfview。但有时,当我加载超过40页的pdf文件时,我会遇到崩溃,如果你们中的任何人能告诉我为什么我会收到这条消息,以及我必须做些什么来避免收到这条错误,这将是非常有帮助的。下面是我收到的logcat错误消息 Logcat错误: Out of memory on a 1322872-byte allocation. FATAL EXCEPTION: AsyncTask #2 java.lang.RuntimeExceptio
Out of memory on a 1322872-byte allocation.
FATAL EXCEPTION: AsyncTask #2
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: java.lang.OutOfMemoryError
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:836)
at android.graphics.Bitmap.createBitmap(Bitmap.java:813)
at android.graphics.Bitmap.createBitmap(Bitmap.java:780)
at com.sun.pdfview.PDFPage.getImage(PDFPage.java:219)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
下面是我的代码:
RandomAccessFile f = new RandomAccessFile(file, "r");
data1 = new byte[(int)f.length()];
f.readFully(data1);
RandomAccessFile f = new RandomAccessFile(file, "r");
byte[] data1 = new byte[(int)f.length()];
f.readFully(data1)
ByteBuffer bb = ByteBuffer.NEW(data1);
PDFFile pdf = new PDFFile(bb);
PDFPage PDFpage = pdf.getPage(1, true);
final float scale = ViewSize / PDFpage.getWidth() * 0.95f;
float pdfWid = PDFpage.getWidth() * scale;
float pdfH = PDFpage.getHeight() * scale;
Bitmap page;
if(page != null){
page.recycle();
page = null;
}
page = PDFpage.getImage((int)pdfWid, (int)pdfH, null, true, true);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
page.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
stream.reset();
String base64 = Base64.encodeToString(byteArray, Base64.NO_WRAP);
String html = "<!DOCTYPE html><html><body bgcolor=\"#b4b4b4\"><img src=\"data:image/png;base64,"+base64+"\" hspace=10 vspace=10><br>";
int size = pdf.getNumPages();
try{
for(int i = 2; i <= size; i++)
{
PDFpage = pdf.getPage(i, true);
page = PDFpage.getImage((int)pdfWid, (int)pdfH, null, true, true);
page.compress(Bitmap.CompressFormat.PNG, 100, stream);
byteArray = stream.toByteArray();
stream.reset();
page.recycle();
base64 = Base64.encodeToString(byteArray, Base64.NO_WRAP);
html += "<img src=\"data:image/png;base64,"+base64+"\" hspace=10 vspace=10><br>";
}
}catch (Exception e){
Log.d("error", e.toString());
}
stream.close();
html += "</body></html>";
wv.loadDataWithBaseURL("", html, "text/html","UTF-8", "");
RandomAccessFile f=新的RandomAccessFile(文件,“r”);
data1=新字节[(int)f.length()];
f、 准备就绪(数据1);
RandomAccessFile f=新的RandomAccessFile(文件“r”);
字节[]数据1=新字节[(int)f.length()];
f、 准备就绪(数据1)
ByteBuffer bb=ByteBuffer.NEW(数据1);
PDFFile pdf=新的PDFFile(bb);
PDFPage PDFPage=pdf.getPage(1,true);
最终浮动比例=ViewSize/PDFpage.getWidth()*0.95f;
float pdfWid=PDFpage.getWidth()*比例;
float pdfH=PDFpage.getHeight()*比例;
位图页面;
如果(第页!=null){
page.recycle();
page=null;
}
page=PDFpage.getImage((int)pdfWid,(int)pdfH,null,true,true);
ByteArrayOutputStream=新建ByteArrayOutputStream();
page.compress(Bitmap.CompressFormat.PNG,100,流);
byte[]byteArray=stream.toByteArray();
stream.reset();
字符串base64=base64.encodeToString(byteArray,base64.NO_WRAP);
字符串html=“
”;
int size=pdf.getNumPages();
试一试{
对于(int i=2;i嗯,我发现我在代码中面临的问题是什么,是堆大小导致了OutofMemory异常。因此,我只是通过声明android:largeHeap=“true”来增加堆大小在解决问题的Manifest中。我发现我在代码中面临的问题是什么,是堆大小导致OutofMemory异常。因此,我只是通过在解决问题的Manifest中声明android:largeHeap=“true”来增加堆大小